Не вдаваясь в подробности (NDA), наше приложение (kotlin + Compose) позволяет пользователям получать звонки, которые они могут принять или отклонить в уведомлениях. Когда экран заблокирован и поступает вызов, отображается экран вызова, как при обычном вызове. Уведомления очень важны для общей функциональности приложения, поэтому мы проверяем, есть ли у приложения разрешения на уведомления, например:
val notificationsPermissionState: PermissionState = rememberPermissionState(
android.Manifest.permission.POST_NOTIFICATIONS
)
если да, приложение отображает главный экран, если нет, показывает экран с объяснением и запросом разрешений.
Учитывая ограничения Android 14 (ссылка ), нам также понадобится USE_FULL_SCREEN_INTENT
для экрана вызова, когда экран устройства заблокирован. В предыдущих версиях Android это предоставлялось автоматически. В Android 14 это все еще так (для нашего приложения), но пользователь может отозвать это.
Теперь вот в чем проблема: когда мы проверяем наличие этого разрешения, USE_FULL_SCREEN_INTENT
, как и в приведенном выше коде, оно всегда возвращает GRANTED, даже если пользователь отозвал его перед открытием приложения или во время его использования. Он даже возвращает GRANTED, если разрешения на уведомления отозваны. С POST_NOTIFICATIONS
такого не происходит. Если пользователь это сделал, отображается ОТКЛОНЕНО. Временное решение — использовать NotificationManager.canUseFullScreenIntent()
, который фактически сообщает о правильном состоянии разрешения. Итак, что происходит? Это ошибка в Android 14? Мы бы предпочли проверять так же, как и другие разрешения, чем добавлять новую систему проверки только для одного крайнего случая.
Спасибо.
Согласно документации, USE_FULL_SCREEN_INTENT
— это normal
разрешение. Вы просто запрашиваете его в манифесте, и он не использует систему времени выполнения (например, rememberPermissionState()
) — это только для разрешений dangerous
.
когда мы проверяем это разрешение
В вашем вопросе не показан код для этого. Если вы используете что-то вроде checkSelfPermission()
, это тоже относится к разрешениям dangerous
и не будет надежно работать для других.
Итак, что происходит? Это ошибка в Android 14?
Я не знаю, почему USE_FULL_SCREEN_INTENT
было установлено как разрешение normal
, если его можно отозвать. Тем не менее, с точки зрения API ваше описание соответствует поведению normal
, так что, ИМХО, это скорее не ошибка, а странный дизайн API.
@DN2048: «Мы проверяем, используя RememberPermissionState(USE_FULL_SCREEN_INTENT)» — это не сработает. Не делай этого. rememberPermissionState()
предназначен только для разрешений dangerous
, а USE_FULL_SCREEN_INTENT
— это normal
, а не dangerous
.
Затем мы вынуждены использовать NotificationManager.canUseFullScreenIntent()
для проверки, пока этот «странный дизайн API» не будет устранен.
@DN2048: Маловероятно, что будут какие-либо изменения в классификации USE_FULL_SCREEN_INTENT
(normal
по сравнению с dangerous
). Например, я не вижу ни одной задачи в трекере задач, требующей изменения ее protectionLevel
значения. Я бы не рассматривал canUseFullScreenIntent()
как временное решение, а скорее как постоянное.
Мы проверяем, используя
rememberPermissionState(USE_FULL_SCREEN_INTENT)
, который возвращает GRANTED, аNotificationManager.canUseFullScreenIntent()
возвращает FALSE, когда пользователь отменяет разрешение на полноэкранное уведомление. И мы можем видеть последствия отказа в разрешении (телефон не разблокируется для экрана вызова), даже еслиrememberPermissionState(USE_FULL_SCREEN_INTENT)
указано ПРЕДОСТАВЛЕНО.