如何监听用户对ACCESS_NOTIFICATION_POLICY权限的授予或拒绝?
嘿,这个问题问得很到位!当我们跳转到系统设置页面请求DND权限时,系统不会直接给我们返回“允许/拒绝”的明确回调,所以得换个思路——在用户从设置页面返回后,主动重新检查权限状态就行啦。下面给你两种可行的方案,优先推荐新的API哦:
方案1:使用Activity Result API(推荐,适配Android 11+)
AndroidX库提供的Activity Result API是替代旧版startActivityForResult的官方方案,更安全也更易维护。步骤如下:
- 首先在你的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(); } } );
- 替换你原来的启动代码,用这个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),可以用这个方法,但官方已经不推荐了:
- 启动设置页面时传入请求码:
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 { // 权限已授予 }
- 重写
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
相关产品推荐
相关产品推荐

