Условие: Есть приложение которое, в определённый момент, должно пробуждать устройство (экран устройства должен включится) и показывать уведомление. Работа осуществляется через BroadcastReceiver.
override fun onReceive(context: Context, intent: Intent)
{
//Будим девай
wakeDevice(context)
//Вызываем функцию показа уведомления
makeBarNotification(context)
}
Всё, что касается пробуждения устройства выведено в отдельную функцию. Код ниже:
private fun wakeDevice(context: Context)
{
//Создаём Power manager
val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
//Создаём WakeLock
val myWakeLock = powerManager.newWakeLock(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, "MyApp:NotificationWakelockTag")
//Указываем длительность работы (В данном случае 5 секунд)
myWakeLock.acquire(5 * 1000L)
//Запускаем WakeLock
myWakeLock.release()
}
В manifest'e прописал строчку: <uses-permission android:name="android.permission.WAKE_LOCK" />
Проблема: Устройство не пробуждается и вылетает ошибка: "java.lang.IllegalArgumentException: Must specify a valid wake lock level."
указывающая на строчку, где я создаю WakeLock (val myWakeLock = ...)
Предположение: Вероятно проблема в WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON. Этот код рекомендуют использовать взамен PowerManager.SCREEN_BRIGHT_WAKE_LOCK вот тут: источник
Вопрос: Как тогда разбудить устройство в ВroadcastReceiver'e если код PowerManager.SCREEN_BRIGHT_WAKE_LOCK - "deprecated", а код WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON приводит к ошибке.
Вы должны использовать один из вариантов при вызове newWakeLock
PARTIAL_WAKE_LOCK
FULL_WAKE_LOCK
SCREEN_DIM_WAKE_LOCK
SCREEN_BRIGHT_WAKE_LOCK
Ресурс: https://stackoverflow.com/questions/15555630/specify-valid-wake-lock-level
Сборка персонального компьютера от Artline: умный выбор для современных пользователей