Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Activity поверх keyguard и разблокировка экрана

#java #android


Есть фоновый сервис, который бродкастом "слушает" сервер. Когда с сервера приходит
звонок, срабатывает метод:

CallActivity1.start(this,
                        qbrtcSession.getConferenceType(),
                        qbrtcSession.getOpponents(),
                        qbrtcSession.getUserInfo(),
                        Consts.CALL_DIRECTION_TYPE.INCOMING);


Где CallActivity1 — одна из активностей приложения, но не главная.
Принимает она:

public static void start(Context context, QBRTCTypes.QBConferenceType qbConferenceType,
                             List opponentsIds, Map userInfo,
                             Consts.CALL_DIRECTION_TYPE callDirectionType){
        Intent intent = new Intent(context, CallActivity1.class);
        intent.putExtra(Consts.CALL_DIRECTION_TYPE_EXTRAS, callDirectionType);
        intent.putExtra(Consts.CALL_TYPE_EXTRAS, qbConferenceType);
        intent.putExtra(Consts.USER_INFO_EXTRAS, (Serializable) userInfo);
        intent.putExtra(Consts.OPPONENTS_LIST_EXTRAS, (Serializable) opponentsIds);
        if (callDirectionType == Consts.CALL_DIRECTION_TYPE.INCOMING) {
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
        }
        context.startActivity(intent);
    }


И в onCreate прописано :

KeyguardManager.KeyguardLock lock = ((KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE);
    PowerManager powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));
    PowerManager.WakeLock wake = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");

    lock.disableKeyguard();
    wake.acquire();

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


По моей логике при звонке окно активности должно открываться всегда, оно почти так
и работает, но попеременно. При разблокированном экране активность ВСЕГДА запускается,
при screen_off иногда, а если на screen_off еще и стоит keyguard, то вообще никогда
не срабатывает, или может появиться и через мнгновенье закрыться.

Пошаговое выполнение показало что как только активность появилась, сразу же сработал
onStop, и почему так — неизвестно.
    


Ответы

Ответ 1



Вам нужно использовать системный тип активити чтобы оно отображалось поверх всего. Для этого нужно добавить в манифест следующие разрешение: и установить для Activity тип TYPE_SYSTEM_OVERLAY. MyActivity.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY); Тогда Activity будет поверх вообще всего, включая экран блокировки. Также вам не нужно будет разблокировать телефон программно ( lock.disableKeyguard(); - не нужен )

Комментариев нет:

Отправить комментарий