一旦建立新连接,我就使用getSSID()来获取wifi网络的名称。 但有时我会为该值获取null。这是我的代码:
清单中的权限是正确的,因为正如我所说的,大多数时候它都有效。
我将此过滤器用于广播接收器:
<action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" />
在广播中我这样做:
if("android.net.wifi.supplicant.CONNECTION_CHANGE".equals(intent.getAction()))
{ boolean bConected = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
if(bConnected == true)
{ WifiManager wifi = (WifiManager) Contexto.getSystemService(Context.WIFI_SERVICE);
String MyName = wifi.getConnectionInfo().getSSID();
Sometimes MyName is null here even if Wifi is connected correctly
}
}
有什么想法吗?
答案 0 :(得分:5)
我定期使用类似的代码,连接后我从未收到null
。
这是我的代码:
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
String myName = info.getSSID();
因此,我建议您在收到CONNECTION_CHANGE
广播后等待400至1000毫秒左右,然后再请求提供信息。
以下是一个实现延迟的示例:
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
String myName = info.getSSID();
}
}, 1000);
答案 1 :(得分:3)
Android开发者网站声明:
如果当前没有网络连接,则SSID可能为空。
您正在收听CONNECTION_CHANGE
事件,如果连接状态从已连接更改为已断开连接,该怎么办?
Wifi设备有时会从接入点断开连接,并且无需您发现它已断开连接,它们会以静默方式重新连接。
答案 2 :(得分:0)
我发现请求者子系统仅与WPA安全机制相关的困难方式,并且实际上不是用于监视一般wifi连接状态的好选择。文档中的措辞会让您相信它是可能的,但在尝试使用请求方操作时遇到了很多麻烦,包括与您描述的问题类似的问题。
来自SupplicantState枚举文件:
这些枚举值用于指示当前值 wpa_supplicant state。这比大多数用户更精细 有兴趣。一般来说,最好使用NetworkInfo.State。
使用NETWORK_STATE_CHANGED_ACTION并查看NetworkInfo额外信息,我能够获得预期的稳定行为。