【问题标题】:Detect when WiFi network fails to authenticate检测 WiFi 网络何时无法进行身份验证
【发布时间】:2017-05-24 15:44:41
【问题描述】:

我正在尝试使用WiFiManager 连接到 WiFi 网络。这是我用来这样做的代码:

WifiManager manager = [...];
WifiConfiguration config = new WifiConfiguration();
manager.setWifiEnabled(true);

//Set SSID, PSK, etc...
[...]

//Connect to the network
int netId = manager.addNetwork(config);
if (netId == -1)
{
    Toast.makeText(this, "Invalid PSK", Toast.LENGTH_LONG).show();
    return;
}
manager.enableNetwork(netId, true);
manager.saveConfiguration();

之前,我为WifiManager.NETWORK_STATE_CHANGED_ACTION 操作注册了一个BroadcastReceiver。我试图通过检查给定NetworkInfoDetailedState 来检测连接何时成功或失败(出于各种原因,包括身份验证)。

连接成功时一切正常,但由于某种原因,连接失败时我的接收器没有“执行”。网络已添加到设备列表中,我可以通过进入 WiFi 设置看到它,但它没有尝试连接(或者它确实尝试连接但没有通知我的接收器)。

有什么线索吗?谢谢!

【问题讨论】:

    标签: android broadcastreceiver android-wifi


    【解决方案1】:

    我终于实现了我想要的。

    要检测连接是否成功,请注册WifiManager.NETWORK_STATE_CHANGED_ACTION 广播意图并检查NetworkInfo.DetailedState.OBTAINING_IPADDR 的详细状态(显然是WiFi)。

    要检测连接失败,请注册WifiManager.SUPPLICANT_STATE_CHANGED_ACTION 广播意图并检查任何WifiManager.EXTRA_SUPPLICANT_ERROR 额外整数(通常为WifiManager.ERROR_AUTHENTICATING)。您可能需要获得对 Android 隐藏 API 的访问权限才能实现这一目标。

    【讨论】:

      【解决方案2】:

      如果连接状态为成功,则 enableNetwork 方法返回 true。 这在成功时工作正常,但不是检查失败状态的最佳方法(如果在第一步身份验证后连接失败,则返回 true)。

      我觉得可以在networkInfo对象中查看实际连接的网络,看看请求是否正常:

      ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(CONNECTIVITY_SERVICE);
      NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
      

      【讨论】:

      • 我不知道enableNetwork方法返回了那个,我会尽快测试它,谢谢输入!但是 WiFi 连接不是异步的,因此需要 WifiManager.NETWORK_STATE_CHANGED_ACTION 吗?或者我可以相信enableNetwork 返回值吗?我只想看看它是否失败(由于身份验证),我可以使用“获取 IP 地址”事件来查看它何时成功。
      • 我试过 Galaxy Core 和 S4 的 enableNetwork 返回,我有两种不同的情况: 1. (Core) - 如果身份验证失败,返回 false 并且不将使用的密码保存在WiFi设置; 2. (S4) - 如果身份验证失败,返回 true 并将密码保存在 WiFi 设置中(我看到类似“身份验证错误”的消息)。如果您不想出现很多错误,我认为最好使用 NETWORK_STATE_CHANGED_ACTION 查看状态...
      • 但我不能,这就是这个问题的重点:使用NETWORK_STATE_CHANGED_ACTION 来查看连接是否失败对我不起作用
      • 嗯..这很奇怪。您能在这里发布您如何注册它以及如何使用它吗?
      • 我使用registerReceiver 和正确的IntentFilter 注册它。我知道它有效,因为我可以使用它来查看连接何时成功。进入onReceive 方法后,我得到NetworkInfoNetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);,并检查详细状态:if (info.getType() == ConnectivityManager.TYPE_WIFI && info.getDetailedState() == NetworkInfo.DetailedState.OBTAINING_IPADDR) {...}。我想对NetworkInfo.DetailedState.FAILED 做同样的事情,但是接收器永远不会被这个信息触发。
      猜你喜欢
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 2016-01-11
      • 1970-01-01
      • 2013-10-29
      相关资源
      最近更新 更多