【问题标题】:Turning on screen programmatically以编程方式打开屏幕
【发布时间】:2023-12-28 21:27:01
【问题描述】:

我想解锁屏幕并将其打开以在事件触发器上显示弹出窗口。我可以使用

解锁屏幕
newKeyguardLock = km.newKeyguardLock(HANDSFREE);
newKeyguardLock.disableKeyguard();

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

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

但没有成功。屏幕仍然关闭。 我怎样才能做到这一点?

【问题讨论】:

    标签: android screen locking


    【解决方案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"/>
    

    【讨论】:

      【解决方案2】:

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

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

      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 level 27 中已弃用FLAG_TURN_SCREEN_ON 标志,因此您可以从API level 27 开始使用Activity.setTurnScreenOn(true)

      【讨论】:

        【解决方案3】:

        作者注:这是我在 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();
        

        【讨论】:

          【解决方案4】:

          未定义的答案与 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();
              }
          }
          

          【讨论】:

            【解决方案5】:

            在您的主要活动的 OnCreate() 中编写以下代码:

            ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG").acquire();
            

            它会导致设备唤醒。

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

            【讨论】: