安卓应用发布后蓝牙扫描异常无法搜索到BLE设备如何解决?
1. 补充Android 12(API 31)及以上版本专属BLE权限
你当前配置的是安卓11及更低版本的BLE权限,从API 31开始,谷歌新增了BLE专属运行时权限,无需绑定位置权限即可使用,你需要在两个Manifest文件中补充以下配置:
<!-- 安卓12+ BLE扫描权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <!-- 安卓12+ BLE连接权限 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 若你的应用需要向外广播BLE信号再加这个,不需要可以不加 --> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
注意:如果你的应用扫描BLE设备确实需要关联位置信息,删除上面的android:usesPermissionFlags="neverForLocation"配置即可。
2. 补充运行时权限申请逻辑
你只在Manifest中声明权限是无效的,安卓6.0(API 23)及以上版本中,位置权限、安卓12+的BLE权限都属于危险权限,需要在代码中主动弹窗向用户申请,用户授权后才能正常使用BLE扫描功能。
额外注意:安卓10(API 29)及以上版本如果没有适配安卓12的专属BLE权限,需要申请ACCESS_FINE_LOCATION权限而非ACCESS_COARSE_LOCATION才能正常扫描BLE设备。
Debug版本正常通常是因为你调试时已经手动授予过权限,Release包首次安装时没有申请权限就会直接扫描失败。
3. 配置BLE组件混淆规则
Release包默认会开启代码混淆,如果你没有配置对应规则,BLE组件的核心类会被混淆裁剪导致功能失效。你需要在项目的android/app/proguard-rules.pro文件中添加BLE组件的免混淆规则,对应ble component 2.0.0版本的规则参考如下:
-keep class com.polidea.rxandroidble2.** { *; } -keep class com.polidea.multiplatformbleadapter.** { *; } -dontwarn com.polidea.rxandroidble2.**
如果使用的是其他BLE组件,替换为对应组件的包名即可。
4. 验证Manifest合并结果
部分第三方依赖可能会在构建时覆盖你声明的权限,你可以在打Release包后检查最终合并后的Manifest文件,确认所有配置的权限都正常存在:
- 合并后的Manifest路径:
android/app/build/intermediates/merged_manifest/release/AndroidManifest.xml
内容的提问来源于stack exchange,提问作者João Augusto Gomides

