关闭Android上的屏幕

关闭Android上的屏幕,android,wakelock,android-wake-lock,Android,Wakelock,Android Wake Lock,我正在尝试在某个特定动作发生后打开和关闭显示器(让我们现在只担心关闭屏幕)。从我对wake lock的理解来看,这就是我所拥有的: PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); 当我阅读stackoverflow和其他

我正在尝试在某个特定动作发生后打开和关闭显示器(让我们现在只担心关闭屏幕)。从我对wake lock的理解来看,这就是我所拥有的:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);    
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
当我阅读stackoverflow和其他地方的其他帖子时,他们似乎告诉我部分唤醒锁定会关闭屏幕。但是如果我阅读SDK,它会说它只允许关闭屏幕。所以我认为这是不对的

任何提示都会有帮助! 谢谢


Mike

以下内容是从中复制的。 如果你想保持屏幕打开,我认为
screen\u BRIGHT\u WAKE\u LOCK
就足够了





关闭屏幕有两种选择:

PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE);

// Choice 1
manager.goToSleep(int amountOfTime);

// Choice 2
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");
wl.acquire();
wl.release();
您可能也需要此权限:

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

对我来说,那些方法不起作用。因此,我使用了其他场景(并非微不足道)来关闭屏幕

Android有两个负责唤醒的标志:

  • 显示-->屏幕超时
  • 应用程序-->开发-->充电时保持清醒复选框
我使用了如下流程:

  • 首先保存您以前的配置,例如屏幕超时为1分钟,并在检查充电时保持清醒

  • 之后,我取消选中充电时保持清醒,并将屏幕超时设置为最短时间

  • 我注册到广播接收器服务,从android获取屏幕关闭的事件

  • 当我关闭屏幕上的事件时,我将以前的配置设置为默认值:屏幕超时为1分钟,并在检查充电时保持清醒

  • 注销接收人

  • 15秒后。设备休眠

    以下是代码片段:

    广播接收机

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    /**
     * Catch Screen On/Off
     * */
    public class BroadcastReceiverScreenListener extends BroadcastReceiver{
    
    private BroadCastListenerCallBackItf mBroadCastListenerCallBack = null;
    
    public BroadcastReceiverScreenListener(
            BroadCastListenerCallBackItf broadCastListenerCallBack) {
        this.mBroadCastListenerCallBack = broadCastListenerCallBack;
    }
    
    @Override
    public void onReceive(Context arg0, Intent intent) {
    
    
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            mBroadCastListenerCallBack.broadCastListenerCallBack__ScreenOff_onResponse();
        }       
    }
    
    }
    
    用作回调的接口

    public interface BroadCastListenerCallBackItf {
        public void broadCastListenerCallBack__ScreenOff_onResponse();
    }
    
    主类中的2个方法:

    ....
    
    AndroidSynchronize mSync = new AndroidSynchronize();
    
    ....
    
    public void turnScreenOff(int wait){
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
    
        BroadCastListenerCallBackItf broadCastListenerCallBack = this;
    
        BroadcastReceiver mReceiver = new BroadcastReceiverScreenListener(broadCastListenerCallBack);       
        m_context.registerReceiver(mReceiver, filter);
    
    
    
        //set Development --> disable STAY_ON_WHILE_PLUGGED_IN
        Settings.System.putInt(
                m_context.getContentResolver(), 
                Settings.System.STAY_ON_WHILE_PLUGGED_IN,
                0                                );
    
    
    
        // take current screen off time 
        int defTimeOut = Settings.System.getInt(m_context.getContentResolver(), 
                Settings.System.SCREEN_OFF_TIMEOUT, 3000);
        // set 15 sec
        Settings.System.putInt(m_context.getContentResolver(), 
                Settings.System.SCREEN_OFF_TIMEOUT, 15000);
    
        // wait 200 sec till get response from BroadcastReceiver on Screen Off
        mSync.doWait(wait*1000);
    
    
        // set previous settings
        Settings.System.putInt(m_context.getContentResolver(), 
                Settings.System.SCREEN_OFF_TIMEOUT, defTimeOut);
    
        // switch back previous state
        Settings.System.putInt(
                m_context.getContentResolver(), 
                Settings.System.STAY_ON_WHILE_PLUGGED_IN,
                BatteryManager.BATTERY_PLUGGED_USB);
    
    
        m_context.unregisterReceiver(mReceiver);
    
    
    }
    
    
    
    
    
    public void broadCastListenerCallBack__ScreenOff_onResponse() {
        mSync.doNotify();
    }
    
    ....
    
    AndroidSynchronize类

    public class AndroidSynchronize {
    
        public void doWait(long l){
            synchronized(this){
                try {
                    this.wait(l);
                } catch(InterruptedException e) {
                }
            }
        }       
    
        public void doNotify() {
            synchronized(this) {
                this.notify();
            }
        }   
    
        public void doWait() {
            synchronized(this){
                try {
                    this.wait();
                } catch(InterruptedException e) {
                }
            }
        }
    }
    
    [编辑]

    您需要注册权限:

    android.permission.WRITE_SETTINGS
    
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    
    试一试- wakeLock.acquire(1000);//指定时间,它会变暗并最终关闭。

    根据此,您也可以按如下方式关闭屏幕:

    Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000);
    
    1000以毫秒为单位,即1秒,您可以根据需要将其替换为任何值

    所需许可:

    android.permission.WRITE_SETTINGS
    
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    
    
    
    根据我的经验,这些方法非常不可靠。嗨,阿拉什,当我尝试第一个选择时,我得到了一个力接近。我试着调试它,但似乎也不起作用。我只是经理,goToSleep(1000);我不知道1000是什么意思。当我尝试选择2时,我什么也没发生。我们确定这会关闭显示器吗?或者它只是阻止其他任何东西关闭显示器。我拥有清单中设置的权限。感谢您的帮助。另外,将值设置为小于0,将亮度设置为默认值(首选屏幕亮度)。再次感谢您的回复!我尝试使用-1,0,并使用保存的变量(getWindow().getAttributes().screenBrightness;更早)来恢复它,每次它返回到只有黑屏且背光打开时。您可能还有其他建议吗?您的第一个方法,选择一,需要设备电源权限。尝试了您的方法,但重要的是它需要android.permission.WRITE\u设置,否则99%的应用不需要这些设置。什么是
    主类
    ?在my
    MainActivity.java
    中尝试过,但
    BroadCastListenerCallBackItf broadCastListenerCallBack=此失败。@Deqing请确保
    MainActivity实现了BroadCastListenerCallBackItf
    谢谢这是我想到的同一个想法。在这15秒内,我启动了一个倒计时,这样用户可以根据需要设置唤醒锁。然后仅当电源连接事件时才移除唤醒锁。我相信您所说的是屏幕超时,与唤醒锁无关。获取(1000);//wakelock在1秒后释放,然后手机的屏幕超时正在完成它的工作。尝试此操作后,屏幕仍需要大约10秒才能关闭。虽然它确实工作,但您可能不想这样做,除非您也读取超时并在之后将超时设置回其原始值;但是,如果您的应用程序因任何原因崩溃,您(或更糟的是,用户)手中的设备会在一秒钟后休眠(并且无法再以这种方式将设置更改为少量时间),此设置也会在重新启动后继续存在,并且您拥有一个完全无用的设备(使用此设置重新启动已经很困难了…)我也在努力解决这个问题,我必须补充一点:当然,在没有连接电缆的情况下进行测试!!!许多设备在连接电缆或未连接电缆的情况下显示不同的行为,因此如果您想测试它,请安装您的应用程序;断开电缆连接,然后测试应用程序!!!
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />