Отключить экран на Android - PullRequest
18 голосов
/ 20 июля 2011

Я пытаюсь включить и выключить дисплей после того, как произойдет определенное действие (пока что стоит просто отключить экран). Из того, что я понимаю из пробуждения, это то, что у меня есть:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);    
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");

Когда я читаю другие сообщения в stackoverflow и в других местах, они, кажется, говорят мне, что PARTIAL_WAKE_LOCK выключит экран. Но если я читаю SDK, он говорит, что он позволит только выключить экран. Поэтому я думаю, что это неправильно.

Любые подсказки будут полезны! Спасибо,

Mike

Ответы [ 5 ]

16 голосов
/ 20 июля 2011

Существует два варианта выключения экрана:

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 выключает экран, когда уровень освещенности становится достаточно низким.

WindowManager.LayoutParams params = getWindow().getAttributes();
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);
7 голосов
/ 20 июля 2011

Следующее скопировано из документа SDK .Если вы хотите, чтобы экран был включен, я думаю, что SCREEN_BRIGHT_WAKE_LOCK достаточно.


Flag Value                CPU   Screen  Keyboard

PARTIAL_WAKE_LOCK          On*    Off      Off

SCREEN_DIM_WAKE_LOCK       On     Dim      Off

SCREEN_BRIGHT_WAKE_LOCK    On     Bright   Off

FULL_WAKE_LOCK             On     Bright   Bright

4 голосов
/ 17 октября 2012

Для меня эти методы не сработали.Поэтому я использовал другой сценарий (не тривиальный), чтобы отключить экран.

В Android есть 2 флага, которые должны быть активными:

  • Дисплей -> Экран TimeOut
  • Приложение -> Разработка -> Бодрствуйте во время зарядки флажок.

Я использовал следующий поток:

  1. 1-йиз всех сохраните вашу предыдущую конфигурацию, например, время ожидания экрана составляло 1 мин и бодрствуйте во время зарядки * проверено .

  2. После того, как я сниму флажок бодрствуйте во время зарядки и установите тайм-аут экрана на минимальное время.

  3. Я регистрируюсь в службе широковещательной рассылки, чтобы получить событие от Android, когда экран выключен.

  4. Когда я выключил событие на экране, я установил предыдущую конфигурацию по умолчанию: время ожидания экрана составляло 1 мин и Бодрствовал во время зарядки * проверено .

  5. Отмена регистрации приемника

Через 15 сек.устройство спит

Вот фрагменты кода:

BroadcastReceiver

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 class

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

[EDIT]

Вам необходимо зарегистрировать разрешение:

android.permission.WRITE_SETTINGS
1 голос
/ 17 августа 2015

По этой ссылке , Вы также можете отключить экран следующим образом:

Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000);

1000 в миллисекундах, что означает 1 секунду, вы можете заменить его любым желаемым значением.

Необходимое разрешение:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />
0 голосов
/ 26 марта 2014

try - wakeLock.acquire (1000);// указать время, оно тускнеет и в конечном итоге выключается.

...