通知运行时权限

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 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()

负责任地使用权限

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