通知运行时权限

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通知样式的通知。

如果您的应用执行以下每个操作,则系统会认为您的应用已配置为自行管理电话呼叫

  1. 声明MANAGE_OWN_CALLS权限。
  2. 实现ConnectionService接口。
  3. 通过调用registerPhoneAccount()向设备的电信提供商注册。

测试您的应用

您可以评估通知权限在应用首次在运行 Android 13 或更高版本的设备上使用时的影响。以下Android 调试桥 (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()

负责任地使用权限

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