繁体   English   中英

唤醒锁不起作用

[英]Wake Lock doesn't work

我正在创建警报,并使用WakeLock在睡眠时唤醒手机。

我在Activity中将以下代码用于唤醒锁:

public void onCreate(Bundle savedInstateState) {
    super.onCreate(savedInstateState);
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    mWakeLock = pm.newWakeLock(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | PowerManager.ACQUIRE_CAUSES_WAKEUP, "My Wake Log");
    mWakeLock.acquire();
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
            WindowManager.LayoutParams.FLAG_FULLSCREEN |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    setContentView(R.layout.activity_screen);
}

但是当时间到了时,我的应用程序崩溃,并显示以下日志猫错误:

java.lang.IllegalArgumentException: Must specify a valid wake lock level.

我已经为AndroidManifest添加了权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />

我以为我已经指定了唤醒级别。 我该怎么做才能解决此问题? 请帮我。 谢谢

WindowManager.LaoutParams.FLAG_KEEP_SCREEN_ON不是PowerManager.newWakeLock()的有效标志/级别。 您最有可能希望它是:

PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP

正确的解决方案如下:将ACQUIRE_CAUSES_WAKEUPPARTIAL_WAKE_LOCK结合使用以唤醒设备。 然后使用WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON保持屏幕打开。 PARTIAL_WAKE_LOCK 尚未被弃用,仍然可以使用。 这是一些示例代码,其中我的服务唤醒设备,启动适当的活动,并使用唤醒锁使设备保持运行状态,直到活动有时间设置必要的标志以使设备和屏幕保持打开状态。

         // start the activity, wake up the screen if required. This would typically
        // be done in an onReceive() method, or in my case it's when a Bluetooth device has been connected.

        PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
        final PowerManager.WakeLock wakeLock = pm.newWakeLock((PowerManager.PARTIAL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP), "BlueMaxService");
        wakeLock.acquire();
        Intent intent = new Intent(this, EmaxActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                wakeLock.release();
            }
        }, 10000L);

在活动中,我设置了各种标志来打开屏幕,关闭锁定屏幕并保持屏幕打开。 这些标志必须尽早设置,因此最好的位置是onAttachedToWindow()

        @Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
}

如果活动已经开始,则需要重新创建该活动,以便可以设置这些标志。 这可以通过在onNewIntent()调用recreate()来完成。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    recreate();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM