1. Android通知权限深度解析
记得我第一次在Android 13设备上测试通知功能时,明明代码都写对了,通知却死活不显示。折腾了半天才发现,原来从Android 13开始,通知权限变成了需要动态申请的危险权限。这个变化让很多开发者措手不及,今天我就来详细说说这个坑怎么避免。
1.1 POST_NOTIFICATIONS权限详解
Android 13引入的POST_NOTIFICATIONS权限属于危险权限类别,这意味着应用必须在运行时明确向用户申请这个权限。我在实际项目中发现,很多开发者容易忽略这个变化,导致在Android 13设备上通知功能失效。
首先要在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
但光有这个声明还不够,必须在代码中动态申请。我建议在应用启动时就检查权限状态,而不是等到要发通知的时候才检查。这样可以避免用户在使用过程中突然弹出权限请求对话框,影响体验。
检查权限的代码很简单:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
// 需要申请权限
} else {
// 已经有权限,可以直接发通知
}
} else {
// Android 13以下版本不需要动态申请
}
这里有个细节要注意:ContextCompat.checkSelfPermission()方法返回的是权限状态。如果返回PackageManager.PERMISSION_GRANTED,说明用户已经授权;如果是PackageManager.PERMISSION_DENIED,就需要发起权限请求。
1.2 权限申请的最佳实践
申请权限不是简单调用一个方法就完事了,这里面有很多细节需要考虑。我踩过几次坑之后,总结出了一套比较稳妥的做法。
首先,要在合适的时机申请权限。我一般会在应用启动后的第一个Activity中检查权限,如果发现没有权限,不会立即弹出申请对话框,而是先展示一个解释性的界面,告诉用户为什么需要这个权限,等用户理解了之后再申请。
申请权限的代码:
private static final int REQUEST_CODE_NOTIFICATION = 1001;
void requestNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
// 用户之前拒绝过,需要解释为什么需要这个权限
showPermissionExplanationDialog();
} else {
// 直接申请权限
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.POST_NOTIFICATIONS},
REQUEST_CODE_NOTIFICATION
);
}
}
}
处


476

被折叠的 条评论
为什么被折叠?



