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