Мне нужно предупредить пользователя об определенных событиях с помощью:
- Вибрация
- Уведомление
Вибрация должна оставаться на неопределенное время, пока пользователь не подтвердит уведомление.
Проблема в том, что вибрация прекращается, когда устройство засыпает. Я прочитал следующие вопросы:
Разрешить телефону вибрировать при выключении экрана
Продолжать вибрацию даже после перехода экрана в спящий режим в Android
На один из вышеупомянутых вопросов был ответ, в котором говорилось, что вибрация без шаблонов - это главное. Итак, я попытался вызвать версию Vibrator.vibrate
, которая принимает миллисекунды вместо шаблона с большим числом, но вибрация все равно прекращается.
В других ответах предлагается зарегистрировать получателя на действии ACTION_SCREEN_OFF
. Это позволит мне возобновить вибрацию, если устройство перейдет в спящий режим после срабатывания будильника, но не будет работать, если устройство уже спало.
Тем не менее, я мог бы заставить эту вещь работать, если бы я мог сначала включить экран, а затем зарегистрировать приемник для обработки любого события отключения экрана, которое может произойти оттуда. Итак, я попытался получить полную блокировку пробуждения при получении события запуска, перед запуском звука или вибрации, но это не работает, несмотря на то, что я использую флаги FULL_WAKE_LOCK и ACQUIRE_CAUSES_WAKEUP. Часть пробуждения работает, но вскоре после этого устройство снова переходит в спящий режим. Я хотел бы думать, что флаг FULL_WAKE_LOCK не работает, потому что он устарел в API 17, но мое устройство - это Samsung, работающий под управлением 4.1.2, то есть API 16!
Рекомендуемый подход теперь, похоже, использует WindowManager.LayoutParams.FLAG_KEEP_SC / a>, но это должно вызываться из активности, и у меня нет никакого экрана, если пользователь не нажимает на уведомление, и если это произойдет, звук и вибрация уже должны быть остановлены.
Так что это похоже на тупик.
Что еще я мог попробовать?
ОБНОВЛЕНИЕ:
Мне не удалось постоянно держать экран включенным с помощью блокировки пробуждения, но, с другой стороны, они позволяют мне включить экран хотя бы на несколько секунд. На самом деле мне не нужно держать экран включенным, поэтому я регистрирую приемник в действии Intent.ACTION_SCREEN_OFF
, и когда экран гаснет, приемник снова возобновляет вибрацию. Это хорошо работало в Samsung, но теперь я переключился на Huawei, чтобы продолжить тестирование, и приемник не работает.
ОБНОВЛЕНИЕ:
Вот трассировка стека исключения в устройстве Huawei:
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)