Android - выключение экрана без перехода в режим StandBy

Я знаю, что этот вопрос задавался много раз, но на него никогда не отвечали удовлетворительно.

Моя проблема заключается в следующем:

У меня есть активность, которая предотвращает отключение экрана в течение предопределенного промежутка времени.

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

Когда предопределенное время закончено, я показываю диалог с обратным отсчетом, чтобы сообщить пользователю, что дисплей выключится через 10 секунд, если он не нажмет "отменить".

Мне удалось отключить дисплей, но телефон всегда переключается в режим StandBy.

Для отключения я использовал:

Window mywindow = getWindow();

WindowManager.LayoutParams lp = mywindow.getAttributes();

lp.screenBrightness = 0.0f;

mywindow.setAttributes(lp);

Есть ли возможность полностью омрачить дисплей, не переходя в режим StandBy (который приостанавливает действие).

Моя цель заключается в том, что пользователь должен просто нажать дисплей, чтобы снова скрасить экран. Таким образом, активность должна оставаться в активном состоянии.

Аналогичный вопрос задан здесь.

Поскольку этот вопрос почти год назад, я надеюсь, что кому-то это удастся тем временем.

Много приветствий

Siggy

Ответы

Ответ 1

Похоже, что отключить экран невозможно. Активируйте его, просто коснувшись дисплея.

Теперь мой новый подход:

private WakeLock screenWakeLock;

PowerManager pm = PowerManager.getSystemService(Context.POWER_SERVICE);
screenWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                                "screenWakeLock");
screenWakeLock.acquire();

PARTIAL_WAKE_LOCK поддерживает работу ЦПУ, но позволяет выключить дисплей.

Когда нажата кнопка питания или дома, дисплей снова включается, и активность снова становится видимой (без необходимости "слайд-разблокировать" или "еще" ).

Не забудьте выпустить screenWakeLock.

В моем случае я сделал это в onResume() активности:

if (screenWakeLock != null) {
   if(screenWakeLock.isHeld())
      screenWakeLock.release();
   screenWakeLock = null;
}

Возможно, это поможет кому-то с подобной проблемой в будущем.

Ответ 2

Примечание: я не смог работать с WAKELOCK

Я вычислил обходное решение, которое связано с изменением SCREEN_OFF_TIMEOUT. Используйте нижеследующее кода для его достижения.

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

это устанавливает 10 миллисекунд в качестве тайм-аута для screen_timeout SYSTEM-WIDE.

Теперь вас могут беспокоить изменения SYSTEM-WIDE, вызванные этим. Чтобы обойти это, вы можете получить значение по умолчанию screen_timeout_time и сохранить его в переменной, а затем вернуть команду System SCREEN_OFF_TIMEOUT в конец() вашей активности.

Перед настройкой 10ms, когда наш экран_timeout получит SCREEN_OFF_TIMEOUT,

int defaultScreenTimeout= android.provider.Settings.
      System.getInt(getContentResolver(),Settings.System.SCREEN_OFF_TIMEOUT,-1);

Теперь, когда вы закончите с вашими изменениями или когда закончите свою деятельность, вы можете снова установить SCREEN_OFF_TIMEOUT.

@Override
public void finish(){
    Settings.System.putInt(getContentResolver(), 
                      Settings.System.SCREEN_OFF_TIMEOUT, defaultScreenTimeout);
super.finish();
}