Пробуждение устройства от экрана блокировки и отображение активности - PullRequest
0 голосов
/ 17 мая 2019

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

Я перепробовал многие ответы, которые нашел по этому поводу, но почти все кажется устаревшим, и я, очевидно, хочу избегать использования этих методов. С текущим кодом, который у меня есть (где я пытался объединить найденные ответы), он будет вибрировать в течение очень короткого времени (что должен делать мой будильник, когда он звонит, но обычно он продолжается до тех пор, пока будильник не отключен) , но не более. При последующем разблокировании устройства действие по отключению будильника не отображается, и будильник не звонит (что делается этим занятием). Однако я проверил и убедился, что метод onCreate () выполняется полностью и без ошибок до конца.

В моем BroadcastReceiver (я использую AlarmManager для выполнения своего кода в нужное время):


    @Override
    public void onReceive(Context context, Intent intent)
    {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "myalarmapp:alarm.");
        wl.acquire(600000);

        Intent startAlarmActivity = new Intent(context, AlarmActivity.class);

        context.startActivity(startAlarmActivity);

        wl.release();
    }

В методе onCreate () моей деятельности:

        setContentView(R.layout.activity_alarm);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {

            setShowWhenLocked(true);
            setTurnScreenOn(true);
            KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
            keyguardManager.requestDismissKeyguard(this, null);
        }
        else {

            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
                    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }

В моем AndroidManifest.xml:

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

...

        <activity
            android:name=".view.AlarmActivity"
            android:excludeFromRecents="true"
            android:showOnLockScreen="true"
            android:showWhenLocked="true"
            android:turnScreenOn="true"
            android:showForAllUsers="true">
        </activity>

Желательно, чтобы действие показывалось «над» экраном блокировки, но это не мой главный приоритет. Было бы достаточно, если бы действие началось, и пользователь должен был разблокировать свой телефон, чтобы увидеть его, все это время, пока оно вибрирует и звонит по телефону. Примечание: я тестирую свое приложение на Android 7.1, и мой текущий минимальный уровень API равен 21.

1 Ответ

0 голосов
/ 18 мая 2019

Я понял это, на самом деле с вейк-замками не было ничего плохого. Проблема заключалась в том, что я также отменил сигнал тревоги (и вызвал finish ()) в методе onStop () действия. Когда экран заблокирован, onStop () был вызван сразу, поэтому он также закрыл активность и перестал звонить.

Я исправил это, проверив следующие логические значения (кредит: Обнаружение блокировки экрана ):


        KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        boolean isPhoneLocked = keyguardManager.inKeyguardRestrictedInputMode();

        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        boolean isScreenAwake = powerManager.isInteractive();

С этим решением мне также удалось показать его на экране блокировки, без необходимости устанавливать параметры для активности в AndroidManifest.

...