通知运行时权限

Android 13 (API level 33) 及更高版本支持一项运行时权限,用于从应用发送非豁免(包括前台服务 (FGS))通知:POST_NOTIFICATIONS。此项更改有助于用户关注对他们最重要的通知。

我们强烈建议您尽快将应用的目标 API 级别设置为 Android 13 或更高版本,以利用此功能的额外控制权和灵活性。如果您继续将目标 API 级别设置为 12L (API level 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 level 32) 或更低版本,则在您创建通知渠道后,或在您的应用启动 Activity 然后创建第一个通知渠道时,系统会首次显示权限对话框。这通常发生在应用启动时。

对现有应用更新的影响

为最大程度地减少通知权限中断,当用户将其设备升级到 Android 13 或更高版本时,系统会自动向所有符合条件的应用预先授予权限。换句话说,这些应用可以继续向用户发送通知,并且用户不会看到运行时权限提示。

预先授予权限的资格

若要使您的应用符合自动预先授予权限的条件,它必须具有现有通知渠道,并且用户未在搭载 12L 或更低版本的设备上明确停用其通知。

如果用户在搭载 12L 或更低版本的设备上停用了您的应用的通知,则该拒绝状态在设备升级到 Android 13 或更高版本后仍会保留。

豁免

本部分包含不受通知权限行为更改影响的通知和应用。在 Android 13(API 级别 33)或更高版本上,如果用户拒绝了通知权限,他们仍会在任务管理器中看到与前台服务相关的通知,但不会在通知抽屉式菜单中看到它们。

媒体会话

媒体会话相关的通知不受此行为更改的影响。

配置为自管理电话的应用

如果您的应用配置为自管理电话,则您的应用无需 POST_NOTIFICATIONS 权限即可发送使用 Notification.CallStyle 通知样式的通知。

如果您的应用执行了以下所有操作,则系统会认为它已配置为自管理电话

  1. 声明 MANAGE_OWN_CALLS 权限。
  2. 实现 ConnectionService 接口。
  3. 通过调用 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,否则您的应用无需显示中间屏幕(标题文本为“获取通知!”的屏幕)。

或者,您可以设置在用户有机会熟悉您的应用后显示请求。例如,您可以等到用户第三次或第四次启动您的应用时再显示。

After the user signs in, they're presented with an
   invitation to get notified of trip updates. After the user presses the
   I'm in button, the app requests the new permission, which causes the system
   dialog to appear
图 1. 请求通知权限的推荐用户驱动工作流程。仅当 shouldShowRequestPermissionRationale() 返回 true 时,才需要中间屏幕。

在上下文中请求权限

在应用中请求通知权限时,请在正确的上下文中进行,以便明确说明通知的用途以及用户为何应该选择加入。例如,电子邮件应用可能包含针对每封新电子邮件发送通知的选项,或者仅针对用户是唯一收件人的电子邮件发送通知。

借此机会,明确您的意图,用户就更有可能授予您的应用通知权限。

检查您的应用是否可以发送通知

在您的应用发送通知之前,请确认用户是否已为您的应用启用通知。为此,请调用 areNotificationsEnabled()

负责任地使用权限

获得发送通知的批准后,请记住负责任地使用该权限。用户可以查看您的应用每天发送的通知数量,并且他们可以随时撤消权限