0

我无法让运行 4.1.2 的 Note 2 或运行 2.2 的 Nexus One 在屏幕关闭的情况下保持“足够清醒”以继续处理 UDP 广播数据包。我尝试了各种唤醒锁和权限(见下文),它在 2.3 上的 Desire HD、2.1 上的华为 U8110(T-Mobile 脉冲 mini)和 2.2.1 上的三星 Galaxy Mini 上运行良好。

它确实直接接收到其 IP/端口的新 TCP 连接并对其进行操作,但不广播 UDP 数据包。如果我点击电源按钮唤醒屏幕,它会立即响应广播。强制屏幕保持打开状态(PowerManager.SCREEN_DIM_WAKE_LOCK 或更高版本)确实让它一直在听,但这不切实际。

我正在获取唤醒锁:

powerManager.newWakeLock(PARTIAL_WAKE_LOCK)
wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL)
wifiManager.createMulticastLock()

并声明权限:

android.permission.INTERNET
android.permission.WAKE_LOCK
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.ACCESS_WIFI_STATE
android.permission.CHANGE_WIFI_STATE

系统 Wifi 睡眠策略是“从不”。

工作设备全部超时,但仍响应 UDP 广播。

在调试器的线程视图中,我可以看到它仍然在 DatagramSocket.receive() 处阻塞,而在工作设备上返回一个数据包,然后记录到 logcat。

所有设备都运行相同的 .apk。

4

1 回答 1

0

有同样问题的其他人的更新:

谷歌似乎认为这应该可以正常工作:

http://code.google.com/p/android/issues/detail?id=34278

Nexus One 很旧,所以我想没人在乎。

然而,Note 2 并非如此,我在三星的开发者论坛中询问过。他们也不在乎:

http://developer.samsung.com/forum/board/thread/view.do?boardName=General&messageId=247968#postId247968

我目前的解决方法是在用户首选项中提供一个选项来获取完整的唤醒锁而不是部分唤醒锁。我添加了代码来覆盖我的 UI,黑屏在点击时消失;尽管背光仍然亮着,但这并不那么烦人,并且可以防止潜在的屏幕烧伤。关闭其他灯(电容式按钮)应该是可行的,但恕我直言,让用户知道他们的手机实际上仍然完全清醒是“好的”。
它会停止设备的正常锁屏超时。手动按下电源按钮将锁定但会关闭屏幕并因此停止 UDP 接收,唤醒时锁屏将永远保持打开状态,直到用户解锁。
所以这提供了糟糕的用户体验,但这是我发现的最好的。

欢迎任何建议。

于 2013-11-24T17:11:53.377 回答