You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 13 POST_NOTIFICATIONS权限申请问题及代码改造咨询

Android 13 POST_NOTIFICATIONS 权限问题解决方案

一、是否遗漏配置?

是的,你需要先在AndroidManifest.xml中声明该权限——系统不会因创建通知渠道自动触发权限请求:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

该权限仅对Android 13(API 33)及以上版本生效,低版本无需额外处理。

二、权限申请的时机与方式

申请时机

建议和位置权限一起在启动页(SplashScreenActivity)请求,或者在首次需要发送通知前触发。结合你的现有逻辑,推荐在位置权限处理流程中同步处理。

申请方式

和其他危险权限流程一致:

  1. 检查权限是否已授予
  2. 未授予则调用ActivityCompat.requestPermissions发起请求
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:14:54