Android 13 POST_NOTIFICATIONS权限申请问题及代码改造咨询
Android 13 POST_NOTIFICATIONS 权限问题解决方案
一、是否遗漏配置?
是的,你需要先在AndroidManifest.xml中声明该权限——系统不会因创建通知渠道自动触发权限请求:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
该权限仅对Android 13(API 33)及以上版本生效,低版本无需额外处理。
二、权限申请的时机与方式
申请时机
建议和位置权限一起在启动页(SplashScreenActivity)请求,或者在首次需要发送通知前触发。结合你的现有逻辑,推荐在位置权限处理流程中同步处理。
申请方式
和其他危险权限流程一致:
- 检查权限是否已授予
- 未授予则调用
ActivityCompat.requestPermissions发起请求 - 在
onRequestPermissionsResult中处理授权结果
三、修改你的SplashScreenActivity代码
步骤1:添加权限请求码常量
在Constant类中新增唯一请求码:
public static final int REQUEST_POST_NOTIFICATIONS = 1003; // 确保未与其他请求码冲突
步骤2:更新HandlePermission方法
在位置权限处理逻辑后,加入通知权限的检查与请求:
@RequiresApi(api = Build.VERSION_CODES.M) private void HandlePermission() { locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { // 先处理位置权限 permissionHandler.takePermission(); // Android 13+ 请求通知权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.POST_NOTIFICATIONS}, Constant.REQUEST_POST_NOTIFICATIONS); } } } else { permissionHandler.locationEnabled(); } }
步骤3:扩展onRequestPermissionsResult回调
添加通知权限的结果处理逻辑:
@RequiresApi(api = Build.VERSION_CODES.M) @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); Log.d(TAG, "REQUEST CODE: " + requestCode + " permission :" + Arrays.toString(permissions)); // 原有位置权限处理逻辑保持不变... // 新增通知权限处理分支 if (requestCode == Constant.REQUEST_POST_NOTIFICATIONS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.d(TAG, "POST_NOTIFICATIONS permission granted"); } else { Snackbar.make(findViewById(R.id.splash_screen), "通知权限被拒绝,将无法接收应用通知", Snackbar.LENGTH_SHORT).show(); } // 根据业务需求,可选择仅当位置+通知权限都授予时启动应用 if (permissionHandler.getPermissionGranted()) { StartApp(); } } }
步骤4:可选:强制双权限校验后启动
如果业务要求必须同时获取位置和通知权限才能进入主页面,可新增权限校验方法:
// 检查通知权限状态 private boolean isNotificationPermissionGranted() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { return ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED; } // 低版本默认返回已授权 return true; } // 修改启动触发逻辑 // 示例:在原有位置权限判断处替换为 if (permissionHandler.getPermissionGranted() && isNotificationPermissionGranted()) { StartApp(); }
注意事项
- 若用户拒绝权限并勾选"不再询问",后续请求不会弹窗,需引导用户前往应用设置页手动开启
- 通知权限属于正常权限组,但Android 13+强制要求显式请求,低版本无需处理
内容的提问来源于stack exchange,提问作者Daniel Lucena
相关产品推荐
相关产品推荐

