即使连接,Android WifiInfo.getBSSID()也会返回null

时间:2015-08-03 13:03:15

标签: android wifi

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

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

此处BSSID为空,但请求者状态为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 :(得分: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;
}

答案 1 :(得分: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();