【发布时间】:2014-06-11 09:29:19
【问题描述】:
我需要通过以下方式提醒用户某些事件:
- 振动
- 通知
在用户确认通知之前,振动应无限期保持。
问题是设备进入睡眠状态时振动停止。我已阅读以下问题:
Allow phone to vibrate when screen turns off
Continue vibration even after the screen goes to sleep mode in Android
an answer 对上述问题之一说,没有模式的振动可以解决问题。所以我尝试调用Vibrator.vibrate 的版本,它接受毫秒而不是大数字的模式,但无论如何振动都会停止。
其他答案建议在ACTION_SCREEN_OFF 操作上注册接收器。如果设备在警报开始后进入睡眠状态,这将允许我恢复振动,但如果设备已经睡眠,则不会工作。
但是,如果我能够先打开屏幕,然后注册接收器以处理从那里可能发生的任何屏幕关闭事件,我就可以让事情正常工作。因此,我尝试在收到触发事件时,在开始声音或振动之前获取完整的唤醒锁,但尽管我使用了标志 FULL_WAKE_LOCK 和 ACQUIRE_CAUSES_WAKEUP,但它不起作用。唤醒部分有效,但不久之后设备再次进入睡眠状态。我想FULL_WAKE_LOCK 标志不起作用,因为它在 API 17 中已被弃用,但我的设备是运行 4.1.2 即 API 16 的三星!
现在推荐的方法似乎是使用 WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ,但这应该从一个活动中调用,除非用户点击通知,否则我没有任何屏幕,如果发生这种情况,声音和振动应该已经已停止。
所以它看起来像一个死胡同。
我还能尝试什么?
更新:
我没有运气通过唤醒锁始终打开屏幕,但另一方面,它们允许我打开屏幕几秒钟。我实际上不需要保持屏幕打开,所以我在Intent.ACTION_SCREEN_OFF 操作上注册接收器,当屏幕熄灭时,接收器再次恢复振动。这在三星上运行良好,但我现在切换到华为继续测试,接收器不工作。
更新:
这是华为设备中异常的堆栈跟踪:
java.util.NoSuchElementException: Death link does not exist
at android.os.BinderProxy.unlinkToDeath(Native Method)
at com.android.server.VibratorService.unlinkVibration(VibratorService.java:294)
at com.android.server.VibratorService.removeVibrationLocked(VibratorService.java:284)
at com.android.server.VibratorService.cancelVibrate(VibratorService.java:213)
at android.os.IVibratorService$Stub.onTransact(IVibratorService.java:83)
at android.os.Binder.execTransact(Binder.java:338)
at dalvik.system.NativeStart.run(Native Method)
【问题讨论】:
标签: java android wakelock android-vibration