PowerManager.WakeLock на устройствах Android

Я пытаюсь реализовать WakeLock в своем приложении для Android. У меня есть следующий код в моем onCreat():

pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
myWakeLock = pm.newWakeLock(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,"WakeLock for Tuner");

Вторая строчка, ведущая к краху. Выдает фатальное исключение. Насколько я вижу, Android говорит, что первый аргумент не является допустимым уровнем блокировки пробуждения. Но на сайте разработчика рекомендуется использовать FLAG_KEEP_SCREEN_ON, поэтому я немного запутался (http://developer.android.com/reference/android/os/PowerManager.html#newWakeLock%28int,%20java.lang.String%29 )

Должен ли я использовать устаревший PowerManager.FULL_WAKE_LOCK?

Следующий код, предложенный в Вопросе Как получить Android WakeLock для работа? , на мой взгляд, неправильный путь.

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

Мне не нужно приложение Wakeup for thehole. Приложение представляет собой тюнер для инструментов и должно бодрствовать только тогда, когда тюнер работает. Планируется вызвать myWakeLock.acquire() в методе startTuner() и аналогичный myWakeLock.release() в методе stopTuner(). Я не могу понять, как это реализовать предложенным способом.

Вот полное сообщение об исключении:

04-13 19:21:14.815: E/AndroidRuntime(9452): FATAL EXCEPTION: main
04-13 19:21:14.815: E/AndroidRuntime(9452): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.benediktbock.ffttest/de.benediktbock.ffttest.MainActivity}: java.lang.IllegalArgumentException: Must specify a valid wake lock level.
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2249)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread.access$700(ActivityThread.java:154)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.os.Looper.loop(Looper.java:137)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread.main(ActivityThread.java:5306)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at java.lang.reflect.Method.invoke(Method.java:511)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at dalvik.system.NativeStart.main(Native Method)
04-13 19:21:14.815: E/AndroidRuntime(9452): Caused by: java.lang.IllegalArgumentException: Must specify a valid wake lock level.
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.os.PowerManager.validateWakeLockParameters(PowerManager.java:488)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.os.PowerManager.newWakeLock(PowerManager.java:474)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at de.benediktbock.ffttest.MainActivity.onCreate(MainActivity.java:62)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.Activity.performCreate(Activity.java:5255)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
04-13 19:21:14.815: E/AndroidRuntime(9452):     ... 11 more

person Benedikt Bock    schedule 13.04.2014    source источник


Ответы (2)


А вот на Сайте разработчика рекомендуется использовать FLAG_KEEP_SCREEN_ON

Это относится к альтернативе использованию WakeLock, если ваша цель состоит в том, чтобы просто держать экран включенным, пока часть вашего пользовательского интерфейса находится на переднем плане.

Должен ли я использовать устаревший PowerManager.FULL_WAKE_LOCK?

Это будет зависеть от того, что вы пытаетесь сделать. Вы должны использовать одну из этих констант на PowerManager в newWakeLock().

Приложение представляет собой тюнер для инструментов и должно бодрствовать только тогда, когда тюнер работает. Планируется вызвать myWakeLock.acquire() в методе startTuner() и аналогичный myWakeLock.release() в методе stopTuner(). Я не могу понять, как это реализовать предложенным способом.

Вызовите setKeepScreenOn(true) на каком-нибудь View в пользовательском интерфейсе тюнера, если хотите, чтобы экран оставался активным. Вызовите setKeepScreenOn(false) на некоторых View в пользовательском интерфейсе вашего тюнера, когда вы хотите, чтобы нормальное поведение экрана возобновилось. В промежутках между этими вызовами, пока ваш пользовательский интерфейс тюнера находится на переднем плане, экран не выключится. В качестве бонуса вам не нужно разрешение WAKE_LOCK.

person CommonsWare    schedule 13.04.2014
comment
Он работает абсолютно нормально. И мне не нужны никакие атрибуты и никакие разрешения. Я не мог придумать лучшего способа - person Benedikt Bock; 13.04.2014

person    schedule
comment
оно работает. Но что именно происходит с PROXIMITY_WAKE_LOCK? - person Benedikt Bock; 13.04.2014
comment
если это работа, ставьте лайк)) так что не помню. кажется, что из это - person xoxol_89; 13.04.2014
comment
в порядке. в общем работает. а вот вейклок зависит от датчика приближения. к сожалению не понятно что происходит с датчиком приближения при настройке. - person Benedikt Bock; 13.04.2014