【问题标题】:PowerManager.WakeLock on Android DevicesAndroid 设备上的 PowerManager.WakeLock
【发布时间】:2014-04-13 17:25:10
【问题描述】:

我正在尝试在我的 Android 应用中实现 WakeLock。我的 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 吗?

在我看来,问题 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

【问题讨论】:

    标签: java android wakelock powermanager


    【解决方案1】:

    但在开发者网站上建议使用 FLAG_KEEP_SCREEN_ON

    这是指使用 WakeLock 的替代方法,如果您的目标只是在某些 UI 处于前台时保持屏幕打开。

    我必须使用已弃用的 PowerManager.FULL_WAKE_LOCK 吗?

    这取决于你想要做什么。您必须在newWakeLock() 中的PowerManager 上使用这些常量之一。

    该应用程序是乐器的调音器,只有在调音器运行时才应保持唤醒状态。计划是在 startTuner() 方法中调用 myWakeLock.acquire() 并在 stopTuner() 方法中类比 myWakeLock.release()。我无法通过建议的方式来实现这一点。

    当您想保持屏幕唤醒时,请在调谐器 UI 中的某个 View 上调用 setKeepScreenOn(true)。当您希望恢复正常的屏幕行为时,请在调谐器 UI 中的某些 View 上调用 setKeepScreenOn(false)。在这些调用之间,只要您的调谐器 UI 处于前台,屏幕就不会关闭。作为奖励,您不需要WAKE_LOCK 权限。

    【讨论】:

    • 它工作得非常好。而且我不需要任何属性,也不需要许可。我想不出更好的方法
    【解决方案2】:
    int PROXIMITY_WAKE_LOCK = 32;
    PowerManager mgr=(PowerManager) getSystemService(Context.POWER_SERVICE);
    proximityWakeLock = mgr.newWakeLock(PROXIMITY_WAKE_LOCK, "Beam");
    

    【讨论】:

    • 它有效。但是 PROXIMITY_WAKE_LOCK 到底发生了什么?
    • 如果它是工作,请喜欢))所以我不记得了。似乎来自this
    • 好的。通常它工作。但唤醒锁定取决于接近传感器。不幸的是,目前尚不清楚在调整过程中接近传感器会发生什么。
    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2015-05-04
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多