我们有一个应用程序可以扫描可用的无线网络。我们收到的报告显示该应用正在录制具有空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 ?
答案 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();