В Android 13 (уровень API 33) и более поздних версиях поддерживается динамическое разрешение на отправку неисключенных уведомлений из приложения (в том числе активных служб): POST_NOTIFICATIONS. Это изменение помогает пользователям сосредоточиться на самых важных уведомлениях.
Мы настоятельно рекомендуем как можно скорее перейти на Android 13 или более позднюю версию, чтобы получить доступ к дополнительным возможностям управления и гибким настройкам. Если вы продолжите использовать Android 12L (уровень API 32) или более раннюю версию, то потеряете часть возможностей, связанных с запросом разрешения в контексте функциональности приложения.
Объявите разрешение
Чтобы запросить новое разрешение на уведомления, обновите приложение до Android 13 и выполните действия, аналогичные запросу других динамических разрешений. Подробные инструкции приведены в разделах ниже.
Разрешение, которое необходимо объявить в файле манифеста приложения, показано в следующем фрагменте кода:
<manifest ...> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <application ...> ... </application> </manifest>
Возможности приложения зависят от выбора пользователя в диалоговом окне разрешений
В этом диалоговом окне пользователям доступны следующие действия:
- Выберите Разрешить.
- Выберите Запретить.
- Проведите по экрану в сторону от диалогового окна, не нажимая ни одну из кнопок.
В следующих разделах описано, как ведет себя приложение в зависимости от действий пользователя.
Пользователь нажимает "Разрешить".
Если пользователь выберет вариант Разрешить, ваше приложение сможет:
- Отправка уведомлений. Разрешены все каналы уведомлений.
- Публиковать уведомления, связанные с активными службами. Они появляются на панели уведомлений.
Пользователь выбирает "Запретить"
Если пользователь выберет вариант Запретить, приложение не сможет отправлять уведомления, если только для него не действует исключение. Все каналы уведомлений заблокированы, за исключением нескольких определенных ролей. Это похоже на то, как если бы пользователь вручную отключил все уведомления для вашего приложения в системных настройках.
Пользователь закрывает диалоговое окно жестом смахивания.
Если пользователь закроет диалоговое окно, не выбрав ни Разрешить, ни Запретить, статус разрешения на уведомления не изменится.
Как это повлияет на новые приложения
Если пользователь установит ваше приложение на устройство с Android 13 или более поздней версией, уведомления этого приложения будут отключены по умолчанию. Приложение не должно отправлять уведомления, пока вы не запросите разрешение и пользователь не предоставит его.
Время появления диалогового окна зависит от целевой версии SDK вашего приложения:
- Если приложение предназначено для Android 13 или более поздней версии, вы можете полностью контролировать, когда будет показываться диалоговое окно с запросом разрешения. Объясните пользователям, зачем приложению нужно это разрешение, и попросите предоставить его.
- Если целевой уровень API вашего приложения – 32 (Android 12L) или ниже, диалоговое окно с запросом разрешения появится, когда приложение впервые запустит действие после создания канала уведомлений или когда приложение запустит действие, а затем создаст свой первый канал уведомлений. Обычно это происходит при запуске приложения.
В приложениях с одним действием, таких как большинство приложений Compose, система показывает диалоговое окно при запуске
MainActivity.
Как это повлияет на обновление существующих приложений
Чтобы свести к минимуму неудобства, связанные с разрешением на уведомления, система автоматически предоставляет его всем подходящим приложениям, когда пользователь обновляет устройство до Android 13 или более поздней версии. Другими словами, эти приложения могут продолжать отправлять уведомления пользователям, и пользователи не увидят запрос на динамическое разрешение.
Требования для предварительного предоставления разрешений
Чтобы приложение соответствовало требованиям для автоматического предоставления разрешения, у него должен быть канал уведомлений, а сами уведомления не должны быть отключены пользователем на устройстве с Android 12L или более ранней версией.
Если пользователь отключил уведомления для вашего приложения на устройстве с Android 12L или более ранней версией, то после обновления до Android 13 или более поздней версии уведомления останутся отключенными.
Исключения
В этом разделе перечислены уведомления и приложения, на которые не распространяется изменение в работе разрешений на уведомления. Если пользователь запретит разрешение на уведомления на устройстве с Android 13 (уровень API 33) или более поздней версии, он по-прежнему будет видеть уведомления, связанные с активными службами, в Менеджере задач, но не в панели уведомлений.
Сеансы воспроизведения медиаконтента
Уведомления, связанные с медиасеансами, не затронуты этим изменением.
Приложения, настроенные на самостоятельное управление телефонными вызовами
Если приложение настроено на самостоятельное управление телефонными звонками, ему не требуется разрешение POST_NOTIFICATIONS, чтобы отправлять уведомления в стиле Notification.CallStyle.
Система считает, что приложение настроено для самостоятельного управления телефонными вызовами, если оно выполняет следующие действия:
- Объявляет разрешение
MANAGE_OWN_CALLS. - Реализует интерфейс
ConnectionService. - Регистрируется у оператора связи устройства, вызывая
registerPhoneAccount().
Тестирование приложения
Вы можете оценить, как разрешение на уведомления влияет на ваше приложение при первом запуске на устройстве с Android 13 или более поздней версией. Следующие наборы команд Android Debug Bridge (ADB) позволяют имитировать наиболее распространенные последовательности выбора пользователя и обновлений устройства без необходимости сбрасывать настройки тестового устройства.
Приложение только что установлено на устройстве с Android 13 или более поздней версии.
adb shell pm revoke PACKAGE_NAME android.permission.POST_NOTIFICATIONS adb shell pm clear-permission-flags PACKAGE_NAME \ android.permission.POST_NOTIFICATIONS user-set adb shell pm clear-permission-flags PACKAGE_NAME \ android.permission.POST_NOTIFICATIONS user-fixedПользователь не отключает уведомления, когда приложение устанавливается на устройство с Android 12L или более ранней версией, а затем обновляет ОС до Android 13 или более поздней версии.
adb shell pm grant PACKAGE_NAME android.permission.POST_NOTIFICATIONS adb shell pm set-permission-flags PACKAGE_NAME \ android.permission.POST_NOTIFICATIONS user-set adb shell pm clear-permission-flags PACKAGE_NAME \ android.permission.POST_NOTIFICATIONS user-fixedПользователь вручную отключает уведомления, когда приложение установлено на устройстве с Android 12L или более ранней версией, а затем обновляет ОС до Android 13 или более поздней версии.
adb shell pm revoke PACKAGE_NAME android.permission.POST_NOTIFICATIONS adb shell pm set-permission-flags PACKAGE_NAME \ android.permission.POST_NOTIFICATIONS user-set adb shell pm clear-permission-flags PACKAGE_NAME \ android.permission.POST_NOTIFICATIONS user-fixed
Рекомендации
В этом разделе описано несколько способов наиболее эффективного использования нового разрешения на уведомления в приложении.
Обновите целевую версию SDK приложения
Чтобы диалоговое окно с запросом разрешения появлялось в нужный момент, обновите приложение, указав в качестве целевой версии Android 13 или более позднюю.
Показывать запрос разрешения на уведомления с задержкой
Прежде чем запрашивать разрешения, дайте пользователям возможность ознакомиться с приложением.
Новые пользователи могут захотеть изучить приложение и понять преимущества каждого отдельного запроса на уведомление. Вы можете активировать запрос разрешений в ответ на действие пользователя. Ниже приведены примеры ситуаций, когда уместно показать запрос разрешения на уведомления.
- Пользователь нажимает на кнопку с колокольчиком.
- Пользователь подписывается на аккаунт в социальной сети.
- Пользователь отправляет заказ на доставку еды.
На рисунке 1 показан рекомендуемый рабочий процесс для запроса разрешения на уведомления. Если метод shouldShowRequestPermissionRationale() не возвращает значение true, то в приложении не нужно показывать средний экран с заголовком "Получайте уведомления!". В Compose вы можете найти текущий Activity, открыв LocalContext.current и приведя его к Activity.
Вы также можете настроить показ запроса после того, как пользователи ознакомятся с вашим приложением. Например, можно подождать, пока пользователь запустит приложение в третий или четвертый раз.
shouldShowRequestPermissionRationale() возвращает true.
Запросите разрешение
Чтобы запросить разрешение в интерфейсе Compose, используйте API rememberLauncherForActivityResult() с контрактом ActivityResultContracts.RequestPermission().
В следующем фрагменте кода показано, как запросить разрешение на уведомления в ответ на действие пользователя:
Kotlin
val context = LocalContext.current
val permissionLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
// Permission granted, you can now send notifications.
} else {
// Permission denied, handle accordingly.
}
}
// ... in your UI ...
Button(onClick = {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}) {
Text("Enable Notifications")
}
Запрашивайте разрешение в контексте
Запрашивайте разрешение на уведомления в подходящем контексте, чтобы пользователю было понятно, для чего они нужны и почему стоит согласиться на их получение. Например, в почтовом приложении могут быть настройки, позволяющие отправлять уведомления о каждом новом письме или только о тех, где пользователь является единственным получателем.
Используйте эту возможность, чтобы объяснить свои намерения, и пользователи с большей вероятностью предоставят разрешение на уведомления для вашего приложения.
Как проверить, может ли приложение отправлять уведомления
Прежде чем отправлять уведомление, проверьте, включены ли они для вашего приложения. Для этого вызовите areNotificationsEnabled().
Используйте разрешение ответственно
Получив разрешение на отправку уведомлений, не злоупотребляйте им. Пользователи могут видеть, сколько уведомлений в день отправляет ваше приложение, и в любой момент отозвать разрешение.