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

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()

生效逻辑说明

  1. Lint会根据代码运行的目标SDK版本自动匹配需要检查的权限列表,不会在低版本上要求系统不存在的权限,告警会直接消除
  2. 当调用方在Android 12及以上系统的代码路径中调用该方法时,Lint会正确校验对应版本要求的所有权限,避免权限缺失导致的运行时崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:03:33