如何针对不同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权限) } }
关键细节说明
- 规避API级别警告:高版本权限(
BLUETOOTH_SCAN/BLUETOOTH_CONNECT)使用字符串形式而非Manifest.permission常量,避免低版本编译时的API级别报错。 - 条件化注解生效:通过
conditional参数指定判断表达式,让对应权限要求仅在目标SDK版本范围内生效:- Android 11及以下:要求旧蓝牙权限
- Android 12+:要求新的运行时权限
- 清单权限配置:在
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" />
- 消除内部API权限提示:函数内部按SDK版本分支编写逻辑,让Android Studio识别不同代码块对应的权限要求,不再触发不必要的警告。
内容的提问来源于stack exchange,提问作者dv_
相关产品推荐
相关产品推荐

