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

如何监听用户对ACCESS_NOTIFICATION_POLICY权限的授予或拒绝?

嘿,这个问题问得很到位!当我们跳转到系统设置页面请求DND权限时,系统不会直接给我们返回“允许/拒绝”的明确回调,所以得换个思路——在用户从设置页面返回后,主动重新检查权限状态就行啦。下面给你两种可行的方案,优先推荐新的API哦:

方案1:使用Activity Result API(推荐,适配Android 11+)

AndroidX库提供的Activity Result API是替代旧版startActivityForResult的官方方案,更安全也更易维护。步骤如下:

  1. 首先在你的Activity或Fragment中注册一个ActivityResultLauncher:
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.provider.Settings;
import android.widget.Toast;

// 在类内部定义
private ActivityResultLauncher<Intent> notificationPolicyLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        // 用户从设置页面返回后,重新检查权限状态
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (notificationManager.isNotificationPolicyAccessGranted()) {
            // 权限已授予,执行你需要的逻辑
            Toast.makeText(this, "DND权限已成功授予", Toast.LENGTH_SHORT).show();
        } else {
            // 用户未授予权限(可能是直接返回或明确拒绝)
            Toast.makeText(this, "DND权限未被授予", Toast.LENGTH_SHORT).show();
        }
    }
);
  1. 替换你原来的启动代码,用这个launcher来打开设置页面:
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !notificationManager.isNotificationPolicyAccessGranted()) {
    Intent intent = new Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
    // 用launcher启动页面,替代原来的startActivity(intent)
    notificationPolicyLauncher.launch(intent);
} else {
    // 权限已经授予,直接执行后续逻辑
}
方案2:使用已废弃的startActivityForResult(仅兼容旧项目)

如果你的项目还在使用旧的Android框架(未迁移到AndroidX),可以用这个方法,但官方已经不推荐了:

  1. 启动设置页面时传入请求码:
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !notificationManager.isNotificationPolicyAccessGranted()) {
    Intent intent = new Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
    // 自定义请求码,比如1001
    startActivityForResult(intent, 1001);
} else {
    // 权限已授予
}
  1. 重写onActivityResult方法,在用户返回后检查权限:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1001) {
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (notificationManager.isNotificationPolicyAccessGranted()) {
            // 权限授予成功
        } else {
            // 权限未被授予
        }
    }
}

重要提示

系统设置页面返回的resultCode通常都是RESULT_CANCELED,不管用户是否授权了权限,所以不能通过resultCode来判断权限状态,必须重新调用isNotificationPolicyAccessGranted()方法来确认当前的权限状态。

内容的提问来源于stack exchange,提问作者Noor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:57:48