以编程方式打开屏幕

21

我想要解锁屏幕并在事件触发时将其打开以显示弹出窗口。我能够使用以下方式解锁屏幕:

newKeyguardLock = km.newKeyguardLock(HANDSFREE);
newKeyguardLock.disableKeyguard();

我正在使用KeyGuardService,但我无法打开屏幕。

wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, HANDSFREE);
wl.acquire();

但没有成功。屏幕仍然保持关闭状态。 我该如何实现这个?

6个回答

36

作者注:此文为2012年所写,不确定目前是否有效。请务必查看其他更新的答案。


Amir的回答让我接近成功,但至少需要使用ACQUIRE_CAUSES_WAKEUP标志(构建Android 2.3.3版本)。

WakeLock screenLock = ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(
     PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
screenLock.acquire();

//later
screenLock.release();

10

这是一个非常流行的问题,但现在接受的答案已经过时了

以下是最新的方法,用于从活动中打开屏幕或唤醒您的设备屏幕:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
    this.setTurnScreenOn(true);
} else {
    final Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}

使用 WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON ,但在 API级别27 中已弃用FLAG_TURN_SCREEN_ON标志,因此您可以从 API级别27 开始使用 Activity.setTurnScreenOn(true)


我在这里提供了Kotlin的解决方案:https://dev59.com/nHE85IYBdhLWcg3wNgrk#76755187 - The_Long_Distance_Runner

3
在您的主活动的OnCreate()方法中编写以下代码:
((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG").acquire();

它会使设备唤醒。

不要忘记使用disableKeyguard()来解锁设备...


1

undefined的答案,带有NullPointer检查和设置超时:

private void turnOnScreen() {
    PowerManager.WakeLock screenLock = null;
    if ((getSystemService(POWER_SERVICE)) != null) {
        screenLock = ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(
                PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
        screenLock.acquire(10*60*1000L /*10 minutes*/);


        screenLock.release();
    }
}

1
这是如何实现的方法:

以下是具体步骤:

PowerManager powerManager = (PowerManager) context.getSystemService(context.POWER_SERVICE);
    PowerManager.WakeLock  wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK |
            PowerManager.ACQUIRE_CAUSES_WAKEUP |
            PowerManager.ON_AFTER_RELEASE, "appname::WakeLock");

    //acquire will turn on the display
    wakeLock.acquire();

请确保在清单文件中设置权限:

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

0

2023年工作的Kotlin版本

我需要稍微修改这个答案https://dev59.com/nHE85IYBdhLWcg3wNgrk#50979446,但最终成功让它运行起来了!

试试简单地:

val window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED)

这真的在屏幕锁定时唤醒了它!

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