Программно включить экран в Android - PullRequest
10 голосов
/ 01 апреля 2012

Я разрабатываю приложение тревоги. Из основной деятельности я установил будильник с помощью трансляции. Затем в onReceive в широковещательном приемнике я вызываю действие, которое позволяет пользователю отключить или отложить будильник ... В этом действии в начале onCreate я использую эти строки для включения экрана и разблокировки устройства:

final Window win = getWindow();
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                  | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                  | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

Это прекрасно работает на Samsung Galaxy S2 с Android 2.3.4, но не работает на HTC с Android 2.3.5. На htc ничего не происходит, и когда я нажимаю кнопку блокировки, экран автоматически разблокируется без перетаскивания круга. Это как flag_dissmiss_keygard работает, но flag_turn_screen_on нет. Есть ли другой способ или другое решение для этого?

Ответы [ 3 ]

14 голосов
/ 29 июля 2012

Я начинал так же, как и вы, и флаги окон не работали.

Наконец-то я заработал, используя две службы Android: KEYGUARD_SERVICE и POWER_SERVICE:

KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
final KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock");
kl.disableKeyguard();

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP
        | PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
wakeLock.acquire();

Не забудьте снять блокировку после пробуждения, когда закончите.

Вам потребуется запросить разрешения DISABLE_KEYGUARD и WAKE_LOCK

3 голосов
/ 08 марта 2016

Вот решение

WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT,
            LayoutParams.TYPE_SYSTEM_ALERT |
                    LayoutParams.TYPE_SYSTEM_OVERLAY,
                    LayoutParams.FLAG_NOT_TOUCH_MODAL |
                    LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    LayoutParams.FLAG_KEEP_SCREEN_ON|
                    LayoutParams.FLAG_DISMISS_KEYGUARD|
                    LayoutParams.FLAG_TURN_SCREEN_ON,
            PixelFormat.TRANSPARENT);

KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    km.isKeyguardLocked();

    windowManager.addView(mTopView, params);
    getWindow().setBackgroundDrawable();
1 голос
/ 25 августа 2014

Я также страдал от многих проблем с моим приложением. На самом деле я хочу блокировку экрана, когда пользователь нажимает кнопку "Назад" дважды. и разблокировать, когда пользователь нажимает кнопку домой.

Для разблокировки устройства код marmor правильный. :) Я использовал этот код.

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
                WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
                                                 | PowerManager.ACQUIRE_CAUSES_WAKEUP
                                                 | PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
                wakeLock.acquire();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...