Можно ли определить, иммерсивный сейчас экран или нет, даже если он не на переднем плане?

Фон

Я изучаю, как заменить пользовательский интерфейс номеронабирателя, когда пользователь получает телефонный звонок (входящие/исходящие телефонные звонки).

Кажется, это возможно двумя способами:

  • В старых версиях Android это возможно при наличии представления сверху, которое активируется PHONE_STATE_CHANGED и NEW_OUTGOING_CALL.

  • В новых версиях Android (как минимум API 23 — Android M-6.0) это возможно путем расширения InCallService и укажите действие, которое будет открыто оттуда. Я даже нашел пример, здесь.

Проблема

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

Но я не могу найти, как это сделать с помощью API.

Что я пробовал

Я попытался просмотреть все документы InCallService. Я также пытался увидеть, могу ли я различать иммерсивное и неиммерсивное, проверяя различные значения, которые я получаю от WindowManager:

    val wm = getSystemService(Service.WINDOW_SERVICE) as WindowManager
    val display = wm.defaultDisplay
    val metrics = DisplayMetrics()
    display.getMetrics(metrics)
    val realMetrics = DisplayMetrics()
    display.getRealMetrics(realMetrics)
    val realSize = Point()
    display.getRealSize(realSize)
    val size = Point()
    display.getSize(size)
    Log.d("AppLog", "mode:${display.mode} state:${display.state} size:$size realSize:$realSize metrics:$metrics realMetrics:$realMetrics rotation:${display.rotation}")

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

Вопрос

Может ли приложение проверить, находится ли экран в режиме погружения?

Если можно, то как и с какой версии Android поддерживается?

Если это невозможно, то почему встроенное приложение знает, как это проверить?


person android developer    schedule 28.06.2018    source источник


Ответы (1)


Вы должны опубликовать свой входящий звонок в качестве уведомления.

В построителе уведомлений используйте намерение «Ожидание», чтобы запустить полноэкранную версию пользовательского интерфейса входящего вызова: builder.setContentIntent(pendingIntent); builder.setFullScreenIntent (pendingIntent, правда);

Система покажет всплывающее уведомление, если есть какие-либо текущие действия (и это должно учитывать режим погружения). Если устройство пользователя выключено и находится на экране блокировки, полноэкранное намерение будет использоваться для запуска полноэкранного пользовательского интерфейса.

person TGunn    schedule 03.07.2018
comment
Это правильно, но я был уверен, что есть разница между тем, используете ли вы иммерсивное приложение и обычное приложение. Встроенное приложение для телефона показывает уведомление для обоих этих случаев. Только если пользователь находится на экране блокировки (или экран выключен), встроенное приложение телефона отображается в полноэкранном режиме. Есть ли способ различать иммерсивные и неиммерсивные приложения? Может быть, для иммерсивных приложений я мог бы быть еще более тонким? - person android developer; 04.07.2018