Android可复用权限检查:如何让IDE识别权限已校验
解决Android Studio权限检查封装后的IDE提示问题
我把蓝牙扫描权限检查的逻辑封装成了一个inline函数withBluetoothScan,只有当BLUETOOTH_SCAN权限通过时才执行传入的代码块,省得在每个函数里重复写冗长的权限判断。但Android Studio识别不了这个代码块里已经具备权限,一直弹权限缺失的提示。我不想用全局的@Suppress("MissingPermission"),希望能像自定义@Safe注解那样,让IDE只在这个函数的代码块内忽略提示。
相关代码
原来重复写的权限检查代码:
if (ActivityCompat.checkSelfPermission( context, Manifest.permission.BLUETOOTH_SCAN ) != PackageManager.PERMISSION_GRANTED ) { return }
封装后的函数:
private inline fun withBluetoothScan(context: Context, block: () -> Unit) { if (ActivityCompat.checkSelfPermission( context, Manifest.permission.BLUETOOTH_SCAN ) == PackageManager.PERMISSION_GRANTED ) { block() } }
期望的注解形式:
@Safe(Manifest.permission.BLUETOOTH_SCAN) private inline fun withBluetoothScan(context: Context, block: () -> Unit) { if (ActivityCompat.checkSelfPermission( context, Manifest.permission.BLUETOOTH_SCAN ) == PackageManager.PERMISSION_GRANTED ) { block() } }
实现方案
1. 自定义权限安全注解
先创建一个注解类,用来标记函数内部的代码块已具备指定权限:
@Retention(AnnotationRetention.BINARY) @Target(AnnotationTarget.FUNCTION) annotation class SafePermission(vararg val value: String)
2. 给封装函数加注解
把这个注解加到你的withBluetoothScan函数上,指定对应的蓝牙扫描权限:
@SafePermission(Manifest.permission.BLUETOOTH_SCAN) private inline fun withBluetoothScan(context: Context, block: () -> Unit) { if (ActivityCompat.checkSelfPermission( context, Manifest.permission.BLUETOOTH_SCAN ) == PackageManager.PERMISSION_GRANTED ) { block() } }
3. 配置Android Studio让它识别注解
这是关键一步,需要在模块的build.gradle.kts(如果用Groovy则是build.gradle)里添加Lint配置,告诉IDE这个注解代表权限已被检查:
android { lint { checkPermissionAnnotations = true // 替换成你注解所在的实际包名 additionalSafeAnnotationClasses += "com.yourpackage.SafePermission" } }
4. 验证效果
现在在withBluetoothScan的代码块里调用需要BLUETOOTH_SCAN权限的API时,Android Studio就不会再弹权限缺失提示了,而且这个忽略只作用于该函数的代码块内,不会影响其他地方的权限检查提示。
补充说明
- 如果需要支持多个权限,直接在注解参数里添加即可,比如
@SafePermission(Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT)。 - 这个方案利用Android Lint的扩展能力,让IDE认可你的自定义权限检查逻辑,比全局抑制提示更精准。
内容的提问来源于stack exchange,提问作者Hamza Jadid
相关产品推荐
相关产品推荐

