Android12拒绝Nearby Devices权限后BLUETOOTH_CONNECT仍显示已授权问题
问题原因
- 最常见的原因是应用的
targetSdkVersion低于31(Android 12版本):这是Android系统的向后兼容机制,对于未适配Android 12的应用,即使你手动关闭了「附近设备」权限,调用checkSelfPermission检查BLUETOOTH_CONNECT等Android 12新增蓝牙权限时,系统依然会返回PERMISSION_GRANTED,只有当你实际调用蓝牙相关API时,才会触发权限拦截,抛出SecurityException或者返回空结果。 - 极小概率是厂商定制ROM的权限映射逻辑异常,导致设置页的权限状态和系统实际返回的校验结果不匹配。
修复方案
- 优先将应用的
targetSdkVersion升级到31及以上,只有适配了Android 12的应用,新蓝牙权限的校验逻辑才会完全生效,设置页修改权限后校验结果会同步更新。 - 不要依赖权限组
NEARBY_DEVICES的校验结果,Google官方明确不建议直接校验权限组,不同厂商对权限组的映射规则可能存在差异,要单独校验你实际使用到的运行时权限。 - 补充蓝牙API调用时的异常捕获逻辑,即使权限校验通过,也需要捕获
SecurityException异常,出现异常时再引导用户到权限设置页开启对应权限,覆盖兼容场景和特殊异常情况。 - 如果你已经适配Android 12还是出现该问题,可以在申请权限时将你用到的所有附近设备相关权限一起申请,比如用到扫描就添加
BLUETOOTH_SCAN,用到设备广播就添加BLUETOOTH_ADVERTISE,避免单权限申请出现的状态不同步问题。
是否为系统层面Bug
绝大多数场景下不是系统Bug,都是targetSdkVersion不匹配触发的系统兼容逻辑,只有极少部分定制ROM的权限管理模块存在异常,才会出现权限状态不同步的问题,这种情况可以向对应厂商反馈修复。
内容的提问来源于stack exchange,提问作者Ayohaych
相关产品推荐
相关产品推荐

