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