Android:如何以编程方式打开和关闭屏幕?

the*_*pot 93 android

在将此帖标记为"重复"之前,我正在撰写此帖子,因为没有其他帖子能够解决问题.

我试图关闭设备,然后在几分钟或传感器更换后,将其重新打开.

关闭显示测试

我可以使用以下方式关闭屏幕:

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);
Run Code Online (Sandbox Code Playgroud)

我无法使用wl.release()方法关闭屏幕.

打开显示测试

我的第一个猜测,如下,不起作用.什么都没发生,屏幕仍然关闭.

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = -1f;
getWindow().setAttributes(params);
Run Code Online (Sandbox Code Playgroud)

然后我也尝试使用唤醒锁,但没有成功.

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "tag");
wl.acquire();
Run Code Online (Sandbox Code Playgroud)

最后我尝试了以下内容,没有结果.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
Run Code Online (Sandbox Code Playgroud)

总而言之,我不会在控制台中遇到任何这些方法的任何错误.当我使用电源按钮打开设备时,我的测试文本"屏幕应该打开",在屏幕上.这表明代码应该已经运行.如果你已经测试了代码,请回答,似乎很多功能,例如params.screenBrightness = -1,根据sdk不能正常工作.

hac*_*bod 66

我假设您只希望在应用程序处于前台时生效.

这段代码:

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);
Run Code Online (Sandbox Code Playgroud)

不会在传统意义上关闭屏幕.它使屏幕尽可能暗淡.在标准平台中,它有多么暗淡是有限的; 如果您的设备实际上允许屏幕完全关闭,那么它是该设备实现的一些特性,而不是您可以依赖设备的行为.

实际上,将此与FLAG_KEEP_SCREEN_ON结合使用意味着即使特定设备允许您将屏幕亮度设置为全关,也不会允许屏幕关闭(因此设备将进入低功耗模式).请牢记这一点.如果屏幕真的关闭,你将使用更多的功率.

现在要将屏幕恢复到常规亮度,只需设置亮度值即可:

WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = -1;
getWindow().setAttributes(params);
Run Code Online (Sandbox Code Playgroud)

我无法解释为什么这不会取代之前设定的0值.作为测试,您可以尝试在其中施加强制全亮度以强制达到特定亮度:

WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 1;
getWindow().setAttributes(params);
Run Code Online (Sandbox Code Playgroud)

这绝对有效.例如,Google的图书应用程序使用它可以让您在使用书籍时将屏幕亮度设置为暗淡,然后在关闭时恢复常规亮度.

为了帮助调试,您可以使用"adb shell dumpsys window"来查看窗口的当前状态.在窗口的数据中,它将告诉您为其设置的当前LayoutParams.确保您认为实际存在的价值.

而且,FLAG_KEEP_SCREEN_ON是一个单独的概念; 它和亮度对彼此没有直接影响.(如果在将亮度设置为0时已经设置了亮度,则在撤消亮度时没有理由再次设置标志.标志将保持设置直到您更改它.)

  • 是否有更好的方法来关闭屏幕? (8认同)
  • 那些实际关闭屏幕的其他方法是什么,而不仅仅是设置可能会或可能不起作用的最小亮度? (6认同)

Raj*_*ran 34

屏幕锁定后我写了这个方法打开屏幕.它对我来说很完美.试试吧-

    private void unlockScreen() {
        Window window = this.getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    }
Run Code Online (Sandbox Code Playgroud)

并从中调用此方法onResume().

  • 那么人们,我建议不要使用我的方法,因为这对我来说不适用于Micromax Canvas2 +.请使用**[此链接](http://stackoverflow.com/a/11708129/840669)**. (6认同)

ram*_*oid 27

我建议这个:

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
wl.acquire();
Run Code Online (Sandbox Code Playgroud)

标志ACQUIRE_CAUSES_WAKEUP的解释如下:

正常的唤醒锁实际上并没有打开照明.相反,它们一旦打开(例如来自用户活动)就会使照明保持打开状态.获取WakeLock时,此标志将强制屏幕和/或键盘立即打开.典型的用途是用于对用户立即看到的重要通知.

此外,请确保您在AndroidManifewst.xml文件中具有以下权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,SCREEN_BRIGHT_WAKE_LOCK标志已被弃用. (3认同)

小智 20

嗨,我希望这会有所帮助:

 private PowerManager mPowerManager;
 private PowerManager.WakeLock mWakeLock;

 public void turnOnScreen(){
     // turn on screen
     Log.v("ProximityActivity", "ON!");
     mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
     mWakeLock.acquire();
}

 @TargetApi(21) //Suppress lint error for PROXIMITY_SCREEN_OFF_WAKE_LOCK
 public void turnOffScreen(){
     // turn off screen
     Log.v("ProximityActivity", "OFF!");
     mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag");
     mWakeLock.acquire();
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但看起来这个功能使用的是"PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK",当接近传感器处于"接近"状态时,它只关闭屏幕. (3认同)
  • 问题 - 一旦我释放“PROXIMITY_SCREEN_OFF_WAKE_LOCK”等待锁,屏幕就会重新打开。我该如何防止这种情况? (2认同)

Pir*_*hah 7

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

  //later
  screenLock.release();
Run Code Online (Sandbox Code Playgroud)

//用户清单文件

  • 这应该是正确的答案.我正在使用Android 5,这是唯一真正有用的东西.唯一的补充是SCREEN_BRIGHT_WAKE_LOCK已被弃用,我没有看到替代品.任何人? (2认同)

Zam*_*ron 6

您确定在Manifest文件中请求了相应的权限吗?

<uses-permission android:name="android.permission.WAKE_LOCK" />
Run Code Online (Sandbox Code Playgroud)

您可以使用AlarmManager 1类触发启动活动的意图并获取唤醒锁定.这将打开屏幕并保持打开状态.释放唤醒锁将允许设备自行进入睡眠状态.

您还可以使用PowerManager将设备设置为睡眠状态:http://developer.android.com/reference/android/os/PowerManager.html#goToSleep(long)


man*_*ani 6

只需添加

android:keepScreenOn="true" 
Run Code Online (Sandbox Code Playgroud)

或致电

setKeepScreenOn(true) 
Run Code Online (Sandbox Code Playgroud)

在父视图上。


Rod*_*ijo 5

最好的方法(使用root设备):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    .
    .
    .

    int flags = WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
    getWindow().addFlags(flags); // this is how your app will wake up the screen
    //you will call this activity later

   .
   .
   .
}
Run Code Online (Sandbox Code Playgroud)

现在我们有这两个函数:

private void turnOffScreen(){

  try{
     Class c = Class.forName("android.os.PowerManager");
     PowerManager  mPowerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
     for(Method m : c.getDeclaredMethods()){
        if(m.getName().equals("goToSleep")){
          m.setAccessible(true);
          if(m.getParameterTypes().length == 1){
            m.invoke(mPowerManager,SystemClock.uptimeMillis()-2);
          }
        }
     } 
  } catch (Exception e){
  }
}
Run Code Online (Sandbox Code Playgroud)

和这个:

public void turnOnScreen(){
  Intent i = new Intent(this,YOURACTIVITYWITHFLAGS.class);
  startActivity(i);
}
Run Code Online (Sandbox Code Playgroud)

对不起,我的英语不好。