is_granted不是android或harmonyos官方api,而是第三方库(如flutter permission_handler)或自定义封装中的方法;android需用contextcompat.checkselfpermission(),harmonyos用verifyselfpermission()或checkpermission()。

is_granted 这个函数名本身不是 Android 或 HarmonyOS 官方 API 中的标准方法。它常见于某些第三方权限库(如 Flutter 的 permission_handler)或开发者自定义封装中,容易被误用或误解为系统原生接口。如果你发现“权限判断失效”,大概率是混淆了权限状态含义、未正确处理运行时流程,或调用了不适用于当前平台的逻辑。
下面分场景说明关键点:
一、Flutter 中 isGranted 状态的实际含义
在 permission_handler 插件里,status.isGranted 表示:
- ✅ Android/iOS 上都已获得该权限的全部能力(如通知、定位、相册等);
- ❌ 但不表示“用户永远点了允许”——它只是当前系统授予结果的快照;
- ⚠️ 注意:
isGranted为true时,不代表后续操作一定成功(例如通知权限开启后,仍需检查 NotificationManager 是否启用监听服务)。
常见误判情况:
- 调用
Permission.notification.status后直接判断isGranted,却没确认 NotificationListener 是否启用(Android 需额外跳转设置页并手动开启); - 在未调用
request()前就查状态,部分平台返回isDenied(iOS 尤其明显),但这只是“未申请”,不是“被拒绝”。
二、Android 原生开发中没有 is_granted() 函数
你不能写 if (is_granted(Manifest.permission.POST_NOTIFICATIONS)) { ... } ——这会编译报错。
正确做法是:
- 使用
ContextCompat.checkSelfPermission()判断是否已有权限; - 对
user_grant类权限(如定位、存储、相机),必须搭配ActivityCompat.requestPermissions()触发弹窗; - 特殊权限(如通知监听、无障碍、自启动)需单独检查对应系统开关,例如:
NotificationManager nm = getSystemService(NotificationManager.class); ComponentName cn = new ComponentName(this, MyNotificationListener.class); boolean hasAccess = nm.isNotificationListenerAccessGranted(cn);
三、HarmonyOS 中权限状态判断要点
HarmonyOS 不提供 is_granted() 方法,而是通过:
-
context.verifySelfPermission()检查system_grant权限(如网络)是否生效; -
context.checkPermission()+requestPermissions()处理user_grant权限(如位置、媒体); - 注意:
ohos.permission.NOTIFICATION_CONTROLLER属于user_grant,需主动申请且用户手动开启服务开关。
四、通用建议:别只信一个 isGranted
权限状态是动态的,应组合验证:
- 当前是否被授予(
checkSelfPermission/status.isGranted); - 是否属于需额外系统开关的权限(如通知监听、悬浮窗、自启动);
- 用户是否勾选了“不再询问”(
isPermanentlyDenied); - 应用是否在后台被系统限制(Android 8.0+ 后台执行限制、HarmonyOS 后台任务管控)。
不复杂但容易忽略。











