前言
在Android 13上对通知的行为做了一些变更,例如通知运行时权限,主要用于从应用发送非豁免通知的运行时权限:POST_NOTIFICATIONS,如果不申请并且允许则无法发送通知。有助于用户专注于最重要的通知。
声明权限
如果targetSdk>=33,首先需要在应用的清单文件中先声明权限:
<manifest>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<application>
XXXXX
</application>
</manifest>
运行时权限申请
然后完成从Android 6.0开始的那套运行时权限申请流程,可以看一下我的另一篇文章:
Android 6.0 适配——管理运行时权限
权限对话框的选择
选择允许
- 发送通知
- 发送与前台服务相关的通知
选择不允许
- 无法发送通知,除非该应用符合豁免条件,例如与媒体会话有关的通知
- 一旦用户选择不允许,下次系统将不会再出现权限申请的弹窗
- 手动引导用户去打开权限:
首先判断是否有通知权限
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.areNotificationsEnabled()
如果没有通知权限,跳到设置界面打开通知权限
private fun startNotificationSetting() {
val applicationInfo = applicationInfo
try {
val intent = Intent()
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
intent.action = "android.settings.APP_NOTIFICATION_SETTINGS"
intent.putExtra("app_package", applicationInfo.packageName)
intent.putExtra("android.provider.extra.APP_PACKAGE", applicationInfo.packageName)
intent.putExtra("app_uid", applicationInfo.uid)
startActivity(intent)
} catch (e: Exception) {
val intent = Intent()
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
intent.action = "android.settings.APPLICATION_DETAILS_SETTINGS"
intent.data = Uri.fromParts("package", applicationInfo.packageName, null)
startActivity(intent)
}
}
滑开对话框,不按任何一个按钮
- 没有任何变化,下次进入对应位置时仍可以弹出通知权限对话框
注意点
应用无需请求POST_NOTIFICATIONS权限即可启动前台服务,但是应用仍必须在启动前台服务时提供一个通知。
结尾
这个更新呢重点还是在于改善用户的体验,用户能够自主选择是否接受应用推送的通知,减少被打扰的情况。