一旦设备在接入点范围内而不打开屏幕,我一直在努力自动打开 Wi-Fi。测试和找出解决方案非常令人沮丧,特别是因为不同的设备有完全不同的结果。
基本测试
在此测试期间保持屏幕关闭。应用程序应该持有一个 WifiLock。
- 走出 WiFi 覆盖范围并在那里停留一分钟。
- 回到报道中。
结果:Wifi 没有立即重新连接,因此应用程序没有重新连接到服务器。根据设备和设置,有时在屏幕打开之前它根本不会重新连接。
强制 Wi-Fi 重新连接
好的,这次我的应用程序会在 Wifi 断开连接时每隔一段时间调用 WifiManager.Reconnect()。
重复测试。结果:适用于 S3,其他设备失败。
尝试添加一些其他调用
尝试了 WifiManager.Scan()、WifiManager.Reassociate()、...等的不同组合。最终它适用于除 S4 之外的大多数设备(HTC、S3)。
似乎适用于所有设备的代码
NetworkInfo wifiInfo = _androidConnectivityMgr.GetNetworkInfo(ConnectivityType.Wifi);
if (!_wifiManager.IsWifiEnabled || _wifiManager.WifiState == WifiState.Disabled || _wifiManager.WifiState == WifiState.Disabling)
{
// Make sure the Wi-Fi is enabled, required for some devices when enable WiFi does not occur immediately
_wifiManager.SetWifiEnabled(true);
}
if (!wifiInfo.IsConnectedOrConnecting)
{
// Do not wait for the OS to initiate a reconnect to a Wi-Fi router
_wifiManager.PingSupplicant();
if (_wifiManager.WifiState == WifiState.Enabled)
{
try
{
// Brute force methods required for some devices
_wifiManager.SetWifiEnabled(false);
_wifiManager.SetWifiEnabled(true);
}
catch (Java.Lang.SecurityException)
{
// Catching exception which should not occur on most devices. OS bug details at :
// https://code.google.com/p/android/issues/detail?id=22036
}
}
_wifiManager.Disconnect();
_wifiManager.StartScan();
_wifiManager.Reassociate();
_wifiManager.Reconnect();
}
我什至不确定所有这些代码是否必要,因为我无法在网上找到太多信息。WifiFixer确实帮助了一些人。但这似乎适用于我测试过的设备。
问题
- 有没有更好的方法来做到这一点?
- 制造商真的修改了我可以看到这么多差异的基本 Android 吗?
- 这是完全错误的方法吗?
感谢您阅读所有这些:)
补充说明
- 代码在从 AlarmManager 启动的 10+ 秒间隔内运行。WakeLock 仅在此呼叫期间保持。
- 在这个看起来很吓人的解决方案/破解之前,“Wifi 睡眠策略”影响了结果。这让我很困惑,因为我一直拿着 WifiLock,我认为这相当于“从不”。
- 以编程方式更改“Wifi 睡眠策略”不适用于 S4,其他人可以确认吗?
- 是的,我们有特定的需要这样做,并且知道电池的影响。