Можно ли определить, является ли экран теперь иммерсивным или нет, даже если не на переднем плане?
Фон
Я исследую, как заменить пользовательский интерфейс звонилки, когда пользователь получает телефонный звонок (входящие / исходящие телефонные звонки).
Это представляется возможным двумя способами:
В старых версиях 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);
Система будет отображать оповещения в случае каких-либо текущих действий (и это должно учитывать режим погружения). Если устройство пользователя выключено и на экране блокировки, полноэкранное намерение будет использоваться для запуска полноэкранного пользовательского интерфейса.