【问题标题】:Android WifiInfo.getBSSID() returning null, even when connectedAndroid WifiInfo.getBSSID() 返回 null,即使已连接
【发布时间】:2015-08-03 13:03:14
【问题描述】:

我们有一个应用程序可以扫描可用的 wifi 网络。我们收到报告称该应用正在记录具有空 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?

【问题讨论】:

    标签: android wifi


    【解决方案1】:

    在获取 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;
    }
    

    【讨论】:

    • 谢谢,但这并不能回答我的问题。无论数据是什么,我都想记录数据,我只是想知道为什么会存在这种差异。对我来说,请求者状态为 COMPLETED 但 BSSID 为空对我来说没有意义,因为如果请求者状态为 COMPLETED 则可能存在 BSSID。如果我的理解有误,请大家指正。
    【解决方案2】:

    您在 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();
    

    【讨论】:

    • 我注意到我们缺少 ACCESS_NETWORK_STATE 权限。这可以解释我的问题中的差异吗?如果我没有访问网络状态的权限,为什么 BSSID 为空,但我仍然可以收集请求者状态?
    猜你喜欢
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多