Android PowerManager.newWakeLock()抛出非法的LargumentException

Android PowerManager.newWakeLock()抛出非法的LargumentException,android,Android,我正在尝试获取唤醒锁,但是当我调用PowerManager.newWakeLock()时,我收到一个非法的argumentException 下面是我用来获取 private void setWakeLock(Context context) { PowerManager pm = (PowerManager) context .getSystemService(Context.POWER_SERVICE); SoundAlarmActivity.WakeLock = p

我正在尝试获取唤醒锁,但是当我调用
PowerManager.newWakeLock()
时,我收到一个非法的argumentException

下面是我用来获取

private void setWakeLock(Context context)
{
    PowerManager pm = (PowerManager) context
    .getSystemService(Context.POWER_SERVICE);
    SoundAlarmActivity.WakeLock = pm.newWakeLock(
    PowerManager.ACQUIRE_CAUSES_WAKEUP
            | PowerManager.ON_AFTER_RELEASE, "Alarm");
    SoundAlarmActivity.WakeLock.acquire();
}
下面是日志:

09-28 12:53:09.704: ERROR/AndroidRuntime(702): java.lang.IllegalArgumentException
09-28 12:53:09.704: ERROR/AndroidRuntime(702):     at android.os.PowerManager$WakeLock.<init>(PowerManager.java:223)
09-28 12:53:09.704: ERROR/AndroidRuntime(702):     at android.os.PowerManager.newWakeLock(PowerManager.java:365)
09-28 12:53:09.704:ERROR/AndroidRuntime(702):java.lang.IllegalArgumentException
09-28 12:53:09.704:ERROR/AndroidRuntime(702):在android.os.PowerManager$WakeLock。(PowerManager.java:223)
09-28 12:53:09.704:ERROR/AndroidRuntime(702):位于android.os.PowerManager.newWakeLock(PowerManager.java:365)
试试这个:

private void setWakeLock(Context context)
{
    PowerManager pm = (PowerManager) context
    .getSystemService(Context.POWER_SERVICE);
    SoundAlarmActivity.WakeLock = pm.newWakeLock(
    PowerManager.FULL_WAKE_LOCK |
        PowerManager.ACQUIRE_CAUSES_WAKEUP
            | PowerManager.ON_AFTER_RELEASE, "BusSnoozeAlarm");
    SoundAlarmActivity.WakeLock.acquire();
}
PowerManager.ACQUIRE\u CAUSES\u WAKEUP不适用于部分唤醒锁,因此在定义所需的唤醒锁类型时,您必须确保使用的是完整的唤醒锁。

您应该定义所需的“类型”唤醒锁。您提供的两个标志只是对级别的补充:

[WakeLock level] Flag Value | CPU | Screen | Keyboard
-----------------------------------------------------
PARTIAL_WAKE_LOCK           | On* | Off    | Off
SCREEN_DIM_WAKE_LOCK        | On  | Dim    | Off
SCREEN_BRIGHT_WAKE_LOCK     | On  | Bright | Off
FULL_WAKE_LOCK              | On  | Bright | Bright

注意:从API级别17开始,除了
部分唤醒锁定
,其他唤醒锁定级别都不推荐使用,您应该使用
LayoutParams。FLAG_KEEP_SCREEN_ON

注意,ACQUIRE_CAUSES_唤醒不会与部分唤醒锁定一起工作。所以让我直说吧。If ACQUIRE_CAUSES_WAKEUP不能单独使用,因为您应该定义您想要的唤醒锁的“种类”,如果不需要,则会出现一个异常,说明“必须指定有效的唤醒锁级别”。因此,您必须从WakeLock级别列表中选择一个。但是,SCREEN_DIM_WAKE_LOCK、SCREEN_BRIGHT_WAKE_LOCK和FULL_WAKE_LOCK被弃用了,你说ok,我还有一个。然后。。。您意识到,唯一一个没有被弃用的,您不能将其用于。那么,有没有正确的方法?完全唤醒锁定|获取原因唤醒工作正常我引入了获取原因唤醒,在创建唤醒锁定时遇到运行时异常“”必须指定有效的唤醒锁定级别“。我添加了部分_WAKELOCK,它被接受了,不管医生怎么说。它似乎也起了作用。不是100%确定它是否有效,是否被接受,但似乎是这样。很难在需要wakelock的情况下强制使用,以证明它确实在工作。因此,使用
PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES _WAKEUP | PowerManager.ON _发布后
通过几天的测试和复制需要WakeLock的条件,我相信我的上述解决方案是可行的。我以前只有一个部分的唤醒锁,直到安卓9,但安卓9失败了。该应用程序正在尝试从一项服务启动一项活动,手机可能已在该服务中休眠数小时。使用安卓9,活动无法启动。将“AQUIRE_CAUSES_WAKEUP”和“ON_AFTER_RELEASE”添加到“PARTIAL_WAKE_LOCK”使其再次工作。非常感谢,我已经尝试了很多方法,您的解决方案也很有效;)完全唤醒锁不是被弃用了吗?如果没有它,我如何获得相同的行为?我引入了ACQUIRE_CAUSES_WAKEUP,并在创建wakelock时遇到运行时异常,该异常“”必须指定有效的唤醒锁级别“。我添加了部分_WAKELOCK,它被接受了,不管医生怎么说。它似乎也起了作用。不是100%确定它是否有效,是否被接受,但似乎是这样。很难在需要wakelock的情况下强制使用,以证明它确实在工作。因此,请在释放后使用
PowerManager.PARTIAL|u WAKE|u LOCK | PowerManager.ACQUIRE|u CAUSES|u WAKEUP | PowerManager.ON|u