Android12附近设备权限检测异常及动态申请方法咨询
问题核心原因
你遇到的权限检测始终返回true的问题,是Android 12(API 31)的附近设备权限兼容规则导致的,最常见的触发场景是App的targetSdkVersion低于31:当target版本低于31时,系统会默认授予BLUETOOTH_CONNECT等新蓝牙权限,即便你手动在设置页关闭权限,checkSelfPermission也会固定返回授权成功,这是系统向后兼容的默认逻辑。
正确处理步骤
- 第一步:核对清单文件权限配置
在AndroidManifest.xml中按版本适配蓝牙相关权限,旧版蓝牙权限添加maxSdkVersion限制,Android 12+的新权限按需声明:
<!-- 适配Android 11及更低版本的蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <!-- Android 12+ 附近设备权限,按实际功能需求声明 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 如果蓝牙扫描不需要关联位置信息,可添加usesPermissionFlags避免申请位置权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
- 第二步:运行时权限检测
检测前先判断系统版本,仅在Android 12及以上版本检测新蓝牙权限,低于该版本的系统不需要申请附近设备权限:
// Java 检测逻辑示例 private static final int REQUEST_NEARBY_PERMISSION = 1001; private boolean hasNearbyPermission(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { return ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED; } // 低于Android 12版本无需新权限,直接返回有权限 return true; }
- 第三步:权限申请逻辑
检测到未授权时,仅在Android 12及以上版本申请对应权限,系统会自动弹出附近设备权限申请弹窗:
// Java 申请逻辑示例 if (!hasNearbyPermission(this)) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, REQUEST_NEARBY_PERMISSION); } }
补充注意事项
如果用户之前拒绝权限时勾选了「不再询问」,调用申请接口不会弹出系统弹窗,此时需要自定义提示引导用户跳转到应用设置页手动开启权限。

内容的提问来源于stack exchange,提问作者luckysing_noobster
相关产品推荐
相关产品推荐

