在安卓设备上使用PowerManager.WakeLock

5

我正在尝试在我的Android应用中实现WakeLock。我在onCreate()方法中有以下代码:

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?
如问题How to get an Android WakeLock to work?所建议的以下代码,在我看来并不是正确的方式。
getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

我不需要整个应用程序都唤醒。该应用程序是乐器的调音器,只有在调音器运行时才需要保持唤醒状态。计划在startTuner()方法中调用myWakeLock.acquire(),在stopTuner()方法中类似地调用myWakeLock.release()。我无法理解如何使用建议的方式实现这一点。
以下是完整的异常消息:
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
2个回答

9
但在开发者网站上,建议使用FLAG_KEEP_SCREEN_ON。这是指作为一种替代使用WakeLock的方法,如果你的目标仅是保持屏幕在前台时,一些UI处于活动状态。
那要看你想做什么。在newWakeLock()中,必须使用PowerManager中的其中一个常量。
该应用程序是乐器调音器,只有在运行调音器时才能保持唤醒状态。打算在startTuner()方法中调用myWakeLock.acquire(),并在stopTuner()方法中类似地调用myWakeLock.release()。但我不知道如何使用推荐的方法实现它。
当你想保持屏幕清醒时,请在调音器UI上的某个视图上调用setKeepScreenOn(true)。当你想要正常屏幕行为恢复时,请在调音器UI上的某个视图上调用setKeepScreenOn(false)。在这些调用之间,只要你的调音器UI在前台,屏幕就不会关闭。另外,你不需要WAKE_LOCK权限,这是一个额外的好处。

它完全正常工作。我不需要任何属性和权限。我想不出更好的方法。 - Benedikt Bock

3
int PROXIMITY_WAKE_LOCK = 32;
PowerManager mgr=(PowerManager) getSystemService(Context.POWER_SERVICE);
proximityWakeLock = mgr.newWakeLock(PROXIMITY_WAKE_LOCK, "Beam");

它能够工作。但是PROXIMITY_WAKE_LOCK到底会发生什么? - Benedikt Bock
如果它能工作,请点个赞,这样我就不会忘记了。看起来是从这里开始的。 - xoxol_89
好的。一般来说它是有效的。但唤醒锁取决于接近传感器。不幸的是,在调整过程中接近传感器发生了什么并不清楚。 - Benedikt Bock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接