我编写了一些使用 Wifi 作为可能的互联网连接介质的软件。不过我确实注意到,在一段时间后(我猜大约是 15-20 分钟),设备进入省电模式后(无论如何,当屏幕变黑时),Wifi 连接将简单地断开,即使它是仍在使用:( 这在 ADP 2 上(因此是带有 Android 1.6 的 Google Ion)...我能够得到以下日志:

06-10 15:04:27.009: DEBUG/WifiService(72): got ACTION_DEVICE_IDLE
06-10 15:04:27.069: ERROR/wpa_supplicant(538): Set_key: Wrong Key
06-10 15:04:27.069: ERROR/wpa_supplicant(538): Set_key: Wrong Key
06-10 15:04:27.069: ERROR/wpa_supplicant(538): Set_key: Wrong Key
06-10 15:04:27.069: ERROR/wpa_supplicant(538): Set_key: Wrong Key
06-10 15:04:27.069: ERROR/wpa_supplicant(538): Set_key: Wrong Key
06-10 15:04:27.069: VERBOSE/WifiMonitor(72): Event [CTRL-EVENT-STATE-CHANGE id=0 state=8]
06-10 15:04:27.079: VERBOSE/WifiStateTracker(72): Changing supplicant state: COMPLETED ==> DORMANT
06-10 15:04:27.079: DEBUG/WifiStateTracker(72): Deconfiguring interface and stopping DHCP
06-10 15:04:27.099: VERBOSE/WifiMonitor(72): Event [CTRL-EVENT-DISCONNECTED - Disconnect event - remove keys]
06-10 15:04:27.099: VERBOSE/WifiMonitor(72): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=8]
06-10 15:04:27.139: WARN/Smack/Packet(169): notify conn break (IOEx), close connection
06-10 15:04:27.139: DEBUG/Smack(169): [XMPPConn] close connection, notifyClosed=false
06-10 15:04:27.139: ERROR/MediaPlayer(390): error (1, -17)
06-10 15:04:27.139: ERROR/MediaPlayer(390): Error (1,-17)
06-10 15:04:28.109: VERBOSE/WifiMonitor(72): Event [CTRL-EVENT-DRIVER-STATE STOPPED]
06-10 15:04:28.129: VERBOSE/WifiStateTracker(72): New network state is DISCONNECTED
06-10 15:04:28.129: VERBOSE/WifiStateTracker(72): Changing supplicant state: DORMANT ==> DORMANT
06-10 15:04:28.189: INFO/MediaUploader(199): No need to wake up
06-10 15:04:28.189: DEBUG/GpsLocationProvider(72): updateNetworkState available
06-10 15:04:28.189: DEBUG/GpsLocationProvider(72): NetworkThread wait for 4484259ms
06-10 15:04:28.289: DEBUG/NetworkLocationProvider(72): onDataConnectionStateChanged 3
06-10 15:04:28.299: DEBUG/GpsLocationProvider(72): state: CONNECTING apnName: iinternet reason: null
06-10 15:04:32.979: DEBUG/NetworkLocationProvider(72): onDataConnectionStateChanged 3
06-10 15:04:33.029: DEBUG/GpsLocationProvider(72): state: CONNECTED apnName: iinternet reason: null
06-10 15:04:33.099: DEBUG/GpsLocationProvider(72): updateNetworkState available
06-10 15:04:33.099: DEBUG/GpsLocationProvider(72): NetworkThread wait for 4479355ms
06-10 15:04:33.129: INFO/MediaUploader(199): No need to wake up
06-10 15:04:33.299: INFO/ActivityManager(72): Stopping service: com.android.mms/.transaction.TransactionService
06-10 15:04:33.339: ERROR/TransactionSettings(156): Invalid APN setting: MMSC is empty
06-10 15:04:33.419: INFO/ActivityManager(72): Stopping service: com.android.providers.downloads/.DownloadService
06-10 15:04:38.309: DEBUG/dalvikvm(199): GC freed 301 objects / 19232 bytes in 92ms
06-10 15:04:43.349: DEBUG/dalvikvm(216): GC freed 1430 objects / 84920 bytes in 121ms
06-10 15:04:48.319: DEBUG/dalvikvm(156): GC freed 323 objects / 15152 bytes in 96ms

这是某种已知的错误/功能吗?如果是这样如何绕过它?还有什么方法可以实际拦截此事件,然后如何忽略它或重新设置 wifi 连接?提前致谢

有帮助吗?

解决方案

您需要创建一个WiFi锁。这里是你如何做到这一点:

WifiManager wifimanager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiLock lock = wifimanager.createWifiLock("my_lock");

lock.acquire();

// your code here

lock.release();

请注意,你应该只当你主动使用WiFi(即下载一个大文件)创建一个无线网络锁,否则就会无谓地影响电池寿命。

其他提示

当我调用 WifiLock.acquire() 时,出现 SecurityException。我的清单中是否缺少使用权限,或者是否需要在代码中事先检查某些内容?我假设这与 wifi 设置页面中的高级设置设置为“从不”有关。

获取采用Wi-Fi锁是不是这个优选的解决方案。在Wi-Fi锁的目的是只持有它,当你积极地访问网络,即下载的文件。例如。 Skype和谷歌的Hangouts不走,并保持了Wi-Fi锁。你应该做的马丁·莫尔纳在上面他的评论说。你应该让他想要让他的设备(和你的App他的设备上),以保持连接到WiFi当显示器关闭时通过“无线唤醒,而在睡眠”设置用户决定。如果你绝对坚持,你的应用程序应该保持无线网络上甚至15分钟后,显示器关闭,即使用户设定的“无线网络唤醒处于休眠模式时”改为“无”,那么你应该采取局部唤醒锁。再次Skype不采取偏唤醒锁定。

如果你真的想有一个漂亮的应用程序,可以接收数据/异步通知,那么你应该建立GCM推送通知。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top