首页 文章

Android WifiInfo.getBSSID()返回null,即使连接时也是如此

提问于
浏览
0

我们有一个应用程序,可以扫描可用的无线网络 . 我们收到报告称应用程序正在录制具有空BSSID的Wifi条目,尽管请求者状态为“已完成”

WifiInfo info = mWifiManager.getConnectionInfo();
String BSSID = info.getBSSID();
SupplicantState state = info.getSupplicantState();

其中BSSID为null,但请求者状态为COMPLETED

文档指出,如果没有可用的网络,BSSID为空:http://developer.android.com/reference/android/net/wifi/WifiInfo.html#getBSSID()

而恳求状态由此定义:http://developer.android.com/reference/android/net/wifi/SupplicantState.html

除非我的理解错误,如果设备已连接到wifi网络,肯定BSSID应该可用吗?如果请求状态为COMPLETED,为什么BSSID为空?

编辑:为清楚起见,我并不真正关心保证BSSID不为空,这不是我的问题 . 我们正在收集数据以进行广泛的分析,如果BSSID为空,那么就是这样,但是混淆的地方在于尽管请求者已经完成,它仍然是空的 . 我真的不确定如何调和这两个结果 . 有关详细信息,我们已确保拥有wifi权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

我们没有通过遗漏的方式获得网络状态的许可:

<uses-permission
    android:name="android.permission.ACCESS_NETWORK_STATE"
    android:required="true" />

ACCESS_NETWORK_STATE不在我们的清单中 .

那么,如果用户已连接到移动网络(3G说),那么请求者状态将返回COMPLETED,但由于我们缺乏权限,我们将无法获得BSSID?

2 回答

  • 0

    在获得BSSID之前检查互联网连接:

    if(checkInternet()){
        WifiInfo info = mWifiManager.getConnectionInfo();
        String BSSID = info.getBSSID();
        SupplicantState state = info.getSupplicantState();
    }
    
    
    public Boolean checkInternet() {
        if (checkWifi()) return true;
        if (checkMobile()) return true;
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connManager.getActiveNetworkInfo() != null) if (connManager.getActiveNetworkInfo().isConnected()) return true;
        return false;
    }
    
    public Boolean checkWifi() {
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (mWifi != null) if (mWifi.isConnected()) return true;
        return false;
    }
    
    public Boolean checkMobile() {
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mMobile = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        if (mMobile != null) if (mMobile.isConnected()) return true;
        return false;
    }
    
  • 0

    您在 getSystemService 中使用了哪种上下文?确保它处于活动状态或尝试使用应用程序上下文 . 并检查 AndroidManifest.xml 中的权限:

    <uses-permission
        android:name="android.permission.ACCESS_NETWORK_STATE"
        android:required="true" />
    <uses-permission
        android:name="android.permission.ACCESS_WIFI_STATE"
        android:required="true" />
    

    之后,以下代码适用于大多数情况 .

    final WifiManager mWifiManager = (WifiManager) applicationContext.getSystemService(Context.WIFI_SERVICE);
    final WifiInfo mWifiInfo = mWifiManager.getConnectionInfo();
        if(mWifiInfo==null){
            return "";
        }
    return mWifiInfo.getBSSID();
    

相关问题