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

Фон

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

Это представляется возможным двумя способами:

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

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

Эта проблема

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

Но я не могу найти, как это сделать с помощью 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 он поддерживается?

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

1 ответ

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

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

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

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