Программно отключить экран в телефоне Android из другого потока

Я пытаюсь выключить экран телефона Android.

Я прочитал много других обсуждений и попробовал два способа, описанных здесь: Отключить экран на Android

На самом деле, мне действительно нужно запустить экран блокировки (тот, который запрашивает PIN-код). Я не был уверен, как это сделать, и не смог найти документацию по этому поводу, поэтому попытался выключить экран и надеялся, что при включении телефона отобразится экран блокировки. К сожалению, я не смог проверить свою теорию.

Первый вариант:

PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");    
wl.acquire();    
wl.release();

Второй вариант:

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

Первый вариант ничего не сделал, а второй вызвал сбой моего приложения. В вызове стека я увидел подозрительный журнал:Only the original thread that created a view hierarchy can touch its views. Я вызываю этот код из другого потока, работающего в фоновом режиме (не основного потока).
Возможно ли, что это вызывает сбой? Как я могу преодолеть эту проблему?
Есть ли другой способ программно запустить экран блокировки, не выключая экран?

1 ответ

В первом варианте добавьте также ACQUIRE_CAUSES_WAKEUP. Это проснет экран и покажет экран блокировки.

PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Your Tag");    

Надеюсь это поможет.

Другие вопросы по тегам