Android 13 (уровень API 33) и более поздних версий поддерживает разрешение среды выполнения для отправки неисключенных уведомлений (включая службы переднего плана (FGS)) из приложения: POST_NOTIFICATIONS
. Это изменение помогает пользователям сосредоточиться на уведомлениях, которые для них наиболее важны.
Мы настоятельно рекомендуем как можно скорее перейти на Android 13 или более позднюю версию, чтобы воспользоваться дополнительным контролем и гибкостью этой функции. Если вы продолжите использовать целевой уровень 12L (уровень API 32) или ниже, вы потеряете некоторую гибкость при запросе разрешения в контексте функциональности вашего приложения .
Объявить разрешение
Чтобы запросить новое разрешение на уведомления из вашего приложения, обновите свое приложение до Android 13 и выполните процесс, аналогичный запросу других разрешений во время выполнения , как показано в следующих разделах.
Разрешение, которое вам необходимо объявить в файле манифеста вашего приложения, отображается в следующем фрагменте кода:
<manifest ...> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <application ...> ... </application> </manifest>
Возможности приложения зависят от выбора пользователя в диалоговом окне разрешений.
В этом диалоговом окне пользователям доступны следующие действия:
- Выберите разрешить
- Выберите не разрешать
- Проведите пальцем от диалогового окна , не нажимая ни одной кнопки.
В следующих разделах описывается, как ведет себя ваше приложение в зависимости от действий, предпринимаемых пользователем.
Пользователь выбирает «Разрешить»
Если пользователь выберет опцию «Разрешить» , ваше приложение сможет выполнять следующие действия:
- Отправляйте уведомления. Разрешены все каналы уведомлений .
- Публикуйте уведомления, связанные со службами переднего плана . Эти уведомления появляются в панели уведомлений .
Пользователь выбирает «Не разрешать»
Если пользователь выберет опцию «не разрешать» , ваше приложение не сможет отправлять уведомления, если оно не соответствует критериям исключения . Все каналы уведомлений заблокированы, за исключением нескольких конкретных ролей. Это похоже на поведение, которое происходит, когда пользователь вручную отключает все уведомления вашего приложения в настройках системы.
Внимание: если ваше приложение нацелено на 12L или ниже, и пользователь нажимает «Не разрешать» хотя бы один раз, ему не будет предложено снова, пока не произойдет одно из следующих событий:
- Пользователь удаляет и переустанавливает ваше приложение.
- Вы обновляете свое приложение для Android 13 или более поздней версии.
Пользователь смахивает из диалогового окна
Если пользователь проводит пальцем по экрану, то есть не выбирает « разрешить » или «не разрешать» , состояние разрешения на уведомление не меняется.
Влияние на вновь установленные приложения
Если пользователь устанавливает ваше приложение на устройство под управлением Android 13 или более поздней версии, уведомления вашего приложения по умолчанию отключены . Ваше приложение должно ждать отправки уведомлений до тех пор, пока вы не запросите новое разрешение и пользователь не предоставит это разрешение вашему приложению.
Время появления диалогового окна разрешений зависит от целевой версии SDK вашего приложения:
- Если ваше приложение предназначено для Android 13 или более поздней версии, оно имеет полный контроль над отображением диалогового окна разрешения. Используйте эту возможность, чтобы объяснить пользователям, почему приложению необходимо это разрешение, и предложите им предоставить его.
- Если ваше приложение нацелено на 12L (уровень API 32) или ниже, система отображает диалоговое окно разрешений, когда ваше приложение впервые запускает действие после создания канала уведомлений или когда ваше приложение запускает действие, а затем создает свой первый канал уведомлений. Обычно это происходит при запуске приложения.
Влияние на обновления существующих приложений
Чтобы свести к минимуму сбои, связанные с разрешением на уведомления, система автоматически предварительно предоставляет разрешение всем подходящим приложениям , когда пользователь обновляет свое устройство до Android 13 или более поздней версии. Другими словами, эти приложения могут продолжать отправлять уведомления пользователям, и пользователи не видят запрос разрешения во время выполнения.
Право на предварительную выдачу разрешения
Чтобы ваше приложение имело право на автоматическое предварительное разрешение, оно должно иметь существующий канал уведомлений и не иметь уведомлений, явно отключенных пользователем на устройстве с версией 12L или ниже.
Если пользователь отключил уведомления для вашего приложения на устройстве с версией 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
Пользователь сохраняет уведомления включенными, когда приложение установлено на устройстве с версией 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
Пользователь вручную отключает уведомления, когда приложение установлено на устройстве с версией 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
, вашему приложению не требуется отображать средний экран — тот, который имеет текст заголовка «Получить уведомление!».
Кроме того, вы можете настроить отображение запроса после того, как вы дадите пользователям возможность ознакомиться с вашим приложением. Например, вы можете подождать, пока пользователь не запустит ваше приложение в третий или четвертый раз.
Запросить разрешение в контексте
Когда вы запрашиваете разрешения на уведомления в своем приложении, делайте это в правильном контексте, чтобы было четко понятно, для чего используются уведомления и почему пользователь должен на них подписаться. Например, приложение электронной почты может включать параметры для отправки уведомлений о каждом новом электронную почту или только те электронные письма, единственным получателем которых является пользователь.
Используйте эту возможность, чтобы обеспечить прозрачность ваших намерений, и пользователи с большей вероятностью предоставят разрешение на уведомление вашему приложению.
Проверьте, может ли ваше приложение отправлять уведомления
Прежде чем ваше приложение отправит уведомление, убедитесь, что пользователь включил уведомления для вашего приложения. Для этого вызовите areNotificationsEnabled()
.
Используйте разрешение ответственно
После того как вы получите разрешение на отправку уведомлений, не забудьте использовать это разрешение ответственно. Пользователи могут видеть количество ежедневных уведомлений, которые отправляет ваше приложение, и могут отозвать разрешение в любое время.