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

如何针对不同Android版本在@RequiresPermission注解中配置权限

解决多版本蓝牙权限注解冲突问题

核心方案:分版本配置条件化权限注解

通过@RequiresPermission的conditional参数,针对不同API级别指定对应的权限要求,同时规避低版本下的API兼容性警告:

@RequiresPermission(
    allOf = [Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN],
    conditional = "android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.S"
)
@RequiresPermission(
    allOf = ["android.permission.BLUETOOTH_SCAN", "android.permission.BLUETOOTH_CONNECT"],
    conditional = "android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S"
)
fun myFunction() {
    // 按SDK版本分支处理蓝牙逻辑
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        // Android 12+ 蓝牙操作(需SCAN/CONNECT权限)
    } else {
        // Android 11及以下蓝牙操作(需BLUETOOTH/BLUETOOTH_ADMIN权限)
    }
}

关键细节说明

  1. 规避API级别警告:高版本权限(BLUETOOTH_SCAN/BLUETOOTH_CONNECT)使用字符串形式而非Manifest.permission常量,避免低版本编译时的API级别报错。
  2. 条件化注解生效:通过conditional参数指定判断表达式,让对应权限要求仅在目标SDK版本范围内生效:
    • Android 11及以下:要求旧蓝牙权限
    • Android 12+:要求新的运行时权限
  3. 清单权限配置:在AndroidManifest.xml中按SDK版本范围声明权限,避免不必要的权限申请:
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:minSdkVersion="31" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" android:minSdkVersion="31" />
  1. 消除内部API权限提示:函数内部按SDK版本分支编写逻辑,让Android Studio识别不同代码块对应的权限要求,不再触发不必要的警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:45:24