Android 12附近设备权限引发蓝牙连接应用崩溃问题咨询
Android 12蓝牙权限问题解答
是否为Android 12强制要求
是。Android 12(API 31)对蓝牙相关权限做了隐私向的重构,将原有的蓝牙权限拆分到「附近设备」权限组,其中BLUETOOTH_CONNECT属于运行时权限,无论应用的目标SDK版本是多少,只要运行在Android 12及以上的设备上,都必须动态申请该权限后才能执行蓝牙连接操作,仅在Manifest中声明权限无效,也不存在绕过用户授权的方案,必须用户手动同意授权后才能正常使用蓝牙功能。
同时适配API 28及以上版本的方案
1. Manifest权限声明兼容
按如下规则声明权限,自动适配不同系统版本:
<!-- 适配API 30及更低版本的老版蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <!-- 若你的应用需要扫描蓝牙设备,API 30及以下需要定位权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" /> <!-- 适配API 31及更高版本的新版蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 如果只需要连接已知MAC地址的设备,不需要扫描蓝牙,可以不声明下面的SCAN权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
2. 代码逻辑分支适配
执行蓝牙相关操作前先判断系统版本,走对应权限校验逻辑:
- 运行系统版本 ≥ Android 12(
Build.VERSION.SDK_INT ≥ 31):先动态申请BLUETOOTH_CONNECT权限,用户授权通过后再执行蓝牙连接操作 - 运行系统版本 ≤ 30:走原有业务逻辑即可,不需要申请新权限
- 注:目标SDK ≤30的应用申请
BLUETOOTH_CONNECT时,系统弹窗显示的授权内容为「允许应用访问附近设备」,和设置页的「附近设备」权限为同一个。
内容的提问来源于stack exchange,提问作者Ayohaych
相关产品推荐
相关产品推荐

