Разрешение проверки USE_FULL_SCREEN_INTENT всегда возвращает GRANTED на Android 14

Не вдаваясь в подробности (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? Мы бы предпочли проверять так же, как и другие разрешения, чем добавлять новую систему проверки только для одного крайнего случая.

Спасибо.

0
0
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документации, USE_FULL_SCREEN_INTENT — это normal разрешение. Вы просто запрашиваете его в манифесте, и он не использует систему времени выполнения (например, rememberPermissionState()) — это только для разрешений dangerous.

когда мы проверяем это разрешение

В вашем вопросе не показан код для этого. Если вы используете что-то вроде checkSelfPermission(), это тоже относится к разрешениям dangerous и не будет надежно работать для других.

Итак, что происходит? Это ошибка в Android 14?

Я не знаю, почему USE_FULL_SCREEN_INTENT было установлено как разрешение normal, если его можно отозвать. Тем не менее, с точки зрения API ваше описание соответствует поведению normal, так что, ИМХО, это скорее не ошибка, а странный дизайн API.

Мы проверяем, используя rememberPermissionState(USE_FULL_SCREEN_INTENT), который возвращает GRANTED, а NotificationManager.canUseFullScreenIntent() возвращает FALSE, когда пользователь отменяет разрешение на полноэкранное уведомление. И мы можем видеть последствия отказа в разрешении (телефон не разблокируется для экрана вызова), даже если rememberPermissionState(USE_FULL_SCREEN_INTENT) указано ПРЕДОСТАВЛЕНО.

DN2048 16.07.2024 15:06

@DN2048: «Мы проверяем, используя RememberPermissionState(USE_FULL_SCREEN_INTENT)» — это не сработает. Не делай этого. rememberPermissionState() предназначен только для разрешений dangerous, а USE_FULL_SCREEN_INTENT — это normal, а не dangerous.

CommonsWare 16.07.2024 15:13

Затем мы вынуждены использовать NotificationManager.canUseFullScreenIntent() для проверки, пока этот «странный дизайн API» не будет устранен.

DN2048 16.07.2024 15:17

@DN2048: Маловероятно, что будут какие-либо изменения в классификации USE_FULL_SCREEN_INTENT (normal по сравнению с dangerous). Например, я не вижу ни одной задачи в трекере задач, требующей изменения ее protectionLevel значения. Я бы не рассматривал canUseFullScreenIntent() как временное решение, а скорее как постоянное.

CommonsWare 16.07.2024 15:22

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