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

时间:2012-03-05 03:36:05

标签: android

在将此帖标记为“重复”之前,我正在撰写此帖子,因为没有其他帖子可以解决问题。

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

关闭显示测试

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

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);

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

启用显示测试

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

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = -1f;
getWindow().setAttributes(params);

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

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "tag");
wl.acquire();

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

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

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

16 个答案:

答案 0 :(得分:63)

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

此代码:

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);

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

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

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

WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = -1;
getWindow().setAttributes(params);

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

WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 1;
getWindow().setAttributes(params);

这绝对有效。例如,谷歌的图书应用程序使用它来允许您在使用书籍时将屏幕亮度设置为暗淡,然后在关闭时恢复常规亮度。

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

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

答案 1 :(得分:31)

我写过这个方法,在屏幕锁定后打开屏幕。它对我来说很完美。试试吧 -

    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);
    }

并从onResume()调用此方法。

答案 2 :(得分:26)

我会建议这个:

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
wl.acquire();

标志ACQUIRE_CAUSES_WAKEUP的解释如下:

  

普通唤醒锁实际上并没有打开照明。代替,   它们一旦打开就会使照明保持打开(例如从   用户活动)。此标志将强制屏幕和/或键盘   获得WakeLock时立即打开。典型用途   将用于对用户来说很重要的通知   立即

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

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

答案 3 :(得分:20)

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

$(document).ready(function() {
     $(".NYC_link").click(function() {
         $("a", this).css('color', 'black');
     });
     $( ".LA_link" ).click(function() {
         $(this).find("a").css('color', 'black');
     });
});

答案 4 :(得分:6)

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

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

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

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

答案 5 :(得分:6)

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

  //later
  screenLock.release();

//用户清单文件     

答案 6 :(得分:4)

以下是在支持较低屏幕亮度值的设备上实现相同功能的成功示例(我在运行API15的Allwinner Chinese 7“平板电脑上进行了测试)。

WindowManager.LayoutParams params = this.getWindow().getAttributes();

/** Turn off: */
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//TODO Store original brightness value
params.screenBrightness = 0.1f;
this.getWindow().setAttributes(params);

/** Turn on: */
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//TODO restoring from original value
params.screenBrightness = 0.9f;
this.getWindow().setAttributes(params);

如果其他人尝试过此操作,请在下方评论是否有效/无效,以及设备Android API。

答案 7 :(得分:3)

这是在棉花糖上做的

private final String TAG = "OnOffScreen";
private PowerManager _powerManager;
private PowerManager.WakeLock _screenOffWakeLock;

public void turnOnScreen() {
    if (_screenOffWakeLock != null) {
        _screenOffWakeLock.release();
    }
}

public void turnOffScreen() {
    try {
        _powerManager = (PowerManager) this.getSystemService(POWER_SERVICE);
        if (_powerManager != null) {
            _screenOffWakeLock = _powerManager.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
            if (_screenOffWakeLock != null) {
                _screenOffWakeLock.acquire();
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

答案 8 :(得分:2)

最好的方法(使用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

   .
   .
   .
}

现在我们有两个功能:

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){
  }
}

而且:

public void turnOnScreen(){
  Intent i = new Intent(this,YOURACTIVITYWITHFLAGS.class);
  startActivity(i);
}

抱歉我的英语不好。

答案 9 :(得分:2)

保持屏幕开启:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

返回屏幕默认模式: 只需清除标志FLAG_KEEP_SCREEN_ON

即可
getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

答案 10 :(得分:2)

如果您的应用是系统应用,则可以使用PowerManager.goToSleep()关闭屏幕,需要特殊权限

在使用goToSleep()之前,您需要像下面这样使用反射:

public static void goToSleep(Context context) {
    PowerManager powerManager= (PowerManager)context.getSystemService(Context.POWER_SERVICE);
    try {
        powerManager.getClass().getMethod("goToSleep", new Class[]{long.class}).invoke(powerManager, SystemClock.uptimeMillis());
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
}

现在,您可以使用goToSleep()关闭屏幕。

  

按下电源键以关闭屏幕时会发生这种情况。

答案 11 :(得分:2)

只需添加

    android:keepScreenOn="true" 

或致电

    setKeepScreenOn(true) 

在父视图上。

答案 12 :(得分:1)

我不希望在活动中“醒来屏幕”。如果屏幕关闭,活动可能处于暂停状态,不应运行任何代码。

醒来时,会出现锁屏问题。我不知道任何应用程序如何自动绕过锁屏。

您应该考虑在服务中运行后台任务,然后使用通知管理器在检测到任何内容时发送通知。通知应提供某种设备警报(屏幕唤醒,通知图标,通知指示等)。单击通知时,它可以启动开始活动的意图。

您也可以尝试直接从服务启动活动,但我真的不知道是否会打开屏幕或绕过锁屏。

答案 13 :(得分:1)

关于Android文档,可以使用以下代码行来实现:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

我已在我的onCreate方法中添加了此功能,但效果很好。

在链接上,您将找到实现此目的的不同方法以及一般解释。

链接到文档:https://developer.android.com/training/scheduling/wakelock.html

答案 14 :(得分:0)

根据Android API 28及更高版本,您需要执行以下操作以打开屏幕

setShowWhenLocked(true); setTurnScreenOn(true); KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); keyguardManager.requestDismissKeyguard(this, null);

答案 15 :(得分:0)

我已经尝试了以上所有解决方案,但没有一个对我有用。所以我用谷歌搜索并找到以下解决方案。我尝试了,就行了。

https://www.tutorialspoint.com/how-to-turn-android-device-screen-on-and-off-programmatically

如果有任何建议,请给出