首页 > 解决方案 > android.permission.ACCESS_WIFI_STATE 触发了这么多完整的状态

问题描述

在我的广播接收器中,我使用下面的代码来识别 Wifi 是连接还是断开。它工作得很好,但是 wifiInfo.getSupplicantState().equals(SupplicantState.COMPLETED) 在连接 wifi 时返回 true 至少 4 到 7 次。

我可以使用 SupplicantState.ASSOCIATING 因为它似乎只触发一次吗?

WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if(wifiManager.isWifiEnabled()){
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    if( wifiInfo.getSupplicantState().equals(SupplicantState.COMPLETED)){ //Connected ??
        //Do Something
    }
    else if( wifiInfo.getSupplicantState().equals(SupplicantState.DISCONNECTED)){       
        //Do Something
    }
}
else{
    //Wifi Adaptor disabled;
}

这是我用于广播接收器的意图过滤器

<receiver
    android:name="WifiReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.net.wifi.STATE_CHANGE"/>
    </intent-filter>
</receiver>

标签: androidwifimanager

解决方案


不,你不能使用,因为从文档ASSOCIATING

尝试与 BSS/SSID 关联。当 wpa_supplicant 找到合适的 BSS 来关联并且驱动程序被配置为尝试在 ap_scan=1 模式下与此 BSS 关联时,就会进入此状态。使用 ap_scan=2 模式时,当驱动程序配置为尝试使用配置的 SSID 和安全策略与网络关联时,将进入此状态。

表示正在进行中。另外,如果您考虑ASSOCIATED

关联完成。当驱动程序报告已成功完成与 AP 的关联时,将进入此状态。如果使用 IEEE 802.1X(带或不带 WPA WPA2),wpa_supplicant 将保持此状态,直到 IEEE 802.1X/EAPOL 验证完成。

因此,这些都处于未完全连接到 wifi AP 的状态。
因此,最好只使用COMPLETED
用于处理重复回调的布尔值,它在 if 块中为真,在 else 块中为假。只有当它为假时才会进入 if 块。


推荐阅读