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

Android Studio(Kotlin)权限请求异常:未弹出权限申请弹窗

你遇到的问题核心是混淆了Android不同权限类型的申请逻辑——你列的5个权限里,大部分是系统自动授予的「正常权限」,只有一个是需要特殊处理的权限,所以你的动态申请代码根本不会触发弹窗。我来帮你拆解清楚:

先搞懂你这5个权限的类型

  • 无需动态申请的正常权限:
    INTERNET、ACCESS_NETWORK_STATE、ACCESS_WIFI_STATE、CHANGE_WIFI_STATE都属于Android的「正常权限」范畴。只要你在AndroidManifest.xml里正确声明了这些权限,系统会在应用安装时自动授予,完全不需要向用户弹窗申请。所以当你调用checkSelfPermission()时,系统直接返回PERMISSION_GRANTED,你的listPermissionsNeeded自然是空的,根本走不到申请逻辑。
  • 需要特殊处理的权限:
    ACCESS_NOTIFICATION_POLICY不属于普通的危险权限组,不能用常规的requestPermissions()方法申请。它需要你引导用户跳转到系统设置页面手动开启,普通的动态申请流程对它无效。

针对你的问题的解决方案

1. 清理不必要的代码

把那4个正常权限的动态申请逻辑删掉吧,完全没必要——只要Manifest里声明了,系统已经自动给你权限了。

2. 正确处理ACCESS_NOTIFICATION_POLICY权限

如果你确实需要这个权限,得用下面的方式处理:

// 获取通知管理器实例
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// 检查是否已获取权限
if (!notificationManager.isNotificationPolicyAccessGranted) {
    // 跳转到系统设置页面让用户手动开启
    val intent = Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS)
    // 如果你用的是ActivityResultAPI(推荐)
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        // 这里可以处理用户返回后的逻辑
        if (notificationManager.isNotificationPolicyAccessGranted) {
            // 权限已开启
        }
    }.launch(intent)
}

注意:这个权限不会弹出普通的权限申请弹窗,而是直接跳转到系统设置页面,需要用户手动操作开启。

为什么你的代码一直返回true?

因为checkSelfPermission()对于正常权限,只要Manifest声明了就会直接返回PERMISSION_GRANTED;而ACCESS_NOTIFICATION_POLICY用checkSelfPermission()根本无法正确判断权限状态,必须用isNotificationPolicyAccessGranted方法来检查——这就是为什么你的listPermissionsNeeded始终为空,完全走不到申请逻辑的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:10:41