Android 如何按版本配置@RequiresPermission注解消除权限警告
Android 信标扫描API权限注解告警解决方案
告警成因
Manifest.permission.BLUETOOTH_SCAN是Android 12(API 级别 31)才新增的系统权限,直接将它和全版本生效的ACCESS_FINE_LOCATION放在同一个@RequiresPermission(allOf = [])数组中时,Lint静态检查会判定该注解要求低版本系统提供不存在的权限,因此弹出权限相关告警。
可行实现方案
通过@RequiresPermission的api参数按系统版本拆分权限声明,即可实现版本匹配的权限校验逻辑,同时直接消除Lint告警。
- 如果你的SDK在Android 12及以上版本没有配置
neverForLocation标记,即蓝牙扫描信标仍需要依赖位置权限,使用如下注解写法:
// API 31以下版本仅需精确定位权限 @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION) // API 31及以上版本同时需要精确定位、蓝牙扫描权限 @RequiresPermission( allOf = [Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH_SCAN], api = Build.VERSION_CODES.S ) fun enableBeaconScan()
- 如果你已经在清单文件中为
BLUETOOTH_SCAN配置了android:usesPermissionFlags="neverForLocation",即Android 12+扫描蓝牙不需要关联位置权限,使用更精准的写法即可:
// Android 6.0 - Android 11 蓝牙扫描依赖精确定位权限 @RequiresPermission( Manifest.permission.ACCESS_FINE_LOCATION, api = Build.VERSION_CODES.M ) // Android 12+ 无位置关联的蓝牙扫描仅需BLUETOOTH_SCAN权限 @RequiresPermission( Manifest.permission.BLUETOOTH_SCAN, api = Build.VERSION_CODES.S ) fun enableBeaconScan()
生效逻辑说明
- Lint会根据代码运行的目标SDK版本自动匹配需要检查的权限列表,不会在低版本上要求系统不存在的权限,告警会直接消除
- 当调用方在Android 12及以上系统的代码路径中调用该方法时,Lint会正确校验对应版本要求的所有权限,避免权限缺失导致的运行时崩溃
内容的提问来源于stack exchange,提问作者Nama
相关产品推荐
相关产品推荐

