java - Android:如何检测 WiFi 是否完全连接?
问题描述
我在 Android WiFi API 中发现了一些奇怪的行为。建立 WiFi 连接后,我需要获取远程 IP 以连接到路由器上的套接字。但令我遗憾的是,我得到了一些未定义的行为。
假设我有 3 个接入点触手可及:
- 网络1
- 网络2
- 网络3
目前我连接到 NET1,我想切换到 NET3。
在这里我连接到wifi:
WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = "NET3";
...
int netId = m_manager.addNetwork(wifiConfig);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
m_context.registerReceiver(mWifiConnectReceiver, intentFilter);
m_manager.disconnect();
m_manager.enableNetwork(networkID, true);
m_manager 这里是WifiManager
.
要接收 WiFi 事件,我有以下代码:
private final BroadcastReceiver mWifiConnectReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent intent) {
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
Log.i("MyApp","--------------------------");
Log.i("MyApp", info.getDetailedState() + ", " + info.getExtraInfo());
String ssid = m_manager.getConnectionInfo().getSSID();
ssid = ssid.replaceAll("^\"(.*)\"$", "$1");
Log.i("MyApp","SSID: " + ssid);
}
});
连接后输出如下:
05-21 11:36:02.081 : CONNECTED, "NET1"
05-21 11:36:02.094 : SSID: NET3
05-21 11:36:02.095 : --------------------------
05-21 11:36:02.095 : CONNECTED, <unknown ssid>
05-21 11:36:02.098 : SSID: NET3
05-21 11:36:02.098 : --------------------------
05-21 11:36:02.098 : DISCONNECTED, <unknown ssid>
05-21 11:36:02.100 : SSID: NET3
05-21 11:36:02.100 : --------------------------
05-21 11:36:02.100 : DISCONNECTED, <unknown ssid>
05-21 11:36:02.104 : SSID: NET3
05-21 11:36:02.104 : --------------------------
05-21 11:36:02.104 : DISCONNECTED, <unknown ssid>
05-21 11:36:02.105 : SSID: NET3
05-21 11:36:02.107 : --------------------------
05-21 11:36:02.107 : DISCONNECTED, "NET1"
05-21 11:36:02.112 : SSID: NET3
05-21 11:36:02.112 : --------------------------
05-21 11:36:02.112 : CONNECTING, "NET1"
05-21 11:36:02.115 : SSID: NET3
05-21 11:36:02.240 : --------------------------
05-21 11:36:02.240 : CONNECTING, "NET3"
05-21 11:36:02.244 : SSID: NET3
05-21 11:36:02.245 : --------------------------
05-21 11:36:02.245 : CONNECTING, "NET3"
05-21 11:36:02.248 : SSID: NET3
05-21 11:36:02.308 : --------------------------
05-21 11:36:02.308 : OBTAINING_IPADDR, "NET3"
05-21 11:36:02.311 : SSID: NET3
05-21 11:36:07.885 : --------------------------
05-21 11:36:07.885 : CONNECTED, "NET3"
05-21 11:36:07.887 : SSID: NET3
05-21 11:36:07.903 : --------------------------
05-21 11:36:07.903 : CONNECTED, "NET3"
05-21 11:36:07.906 : SSID: NET3
在这里我看到很多不一致的地方:
- 第一个 CONNECTED 令人费解——为什么会出现在这里?NET1 已经连接。为什么当我连接到 NET3 时,它会为 NET1 触发 CONNECTED?
- 为什么
NetworkInfo
报告 NET1(这是正确的)而 getConnectionInfo() 报告 NET3? - 最让我担心的问题是——我怎样才能以某种清晰的方式检测到与提议的网络的连接?可以从中提取SSID
NetworkInfo
吗?
更新
我发现以下代码返回正确的 SSID:
WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
if(wifiInfo != null) {
String ssid = wifiInfo.getSSID();
ssid = ssid.replaceAll("^\"(.*)\"$", "$1");
}
可能是 user 而不是m_manager.getConnectionInfo().getSSID()
.
解决方案
推荐阅读
- python - 如何在不重新定义的情况下在多个命名空间中重用模型?
- excel - 循环复制粘贴和特殊粘贴在不同的工作表中
- c++ - 我无法让我的程序工作我不断收到未定义的符号:c
- c# - Flurl 测试:如何根据条件设置响应?
- php - 如何在 php 或 jquery 中使用 Nav Dynamics Soap Webservice?
- linux - md5 校验和在后续运行中更改,输出相同
- swift - NSTableView:如果我设置“行大小样式:自动”,那么所有行都有 0px 大小
- sql - 在 SQL 中循环并插入多个逗号分隔的 List
- c# - 系统年份 YYYY 加上库尔姆的值 MMDD 在 C# 中作为“dd-MMM-yyyy”插入数据库
- awk - 提取部分列以制作 cp 命令