uni-app 在安卓13上需申请定位权限后才能搜到蓝牙
uni-app 在安卓13上需申请定位权限后才能搜到蓝牙
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | 11 | HBuilderX |
### 操作步骤:
在Android 13上, 不申请定位权限 就可以搜到蓝牙设备
### 预期结果:
在Android 13上, 不申请定位权限 就可以搜到蓝牙设备
### 实际结果:
在Android 13上, 不申请定位权限 就可以搜到蓝牙设备
### bug描述:
使用同一台电脑打包今天遇到的问题如下:
1. 之前打包后, 在Android 13手机上, 申请"BLUETOOTH_SCAN" 与 "BLUETOOTH_CONNECT", 后就可以搜到蓝牙设备.
2. 今天新打包后, 需要申请"ACCESS_FINE_LOCATION"后, 才能搜到蓝牙设备
3. 使用的是云端证书
4. 代码逻辑也没改动
5. 唯一变化的是HBuilderX从 "3.8.12"升到了"3.96"
请问应该如何解决?
3 回复
已解决
怎么解决的 佬
在 Android 13 及更高版本中,Google 引入了更严格的权限管理机制,特别是对于蓝牙和定位权限的处理。为了在 Android 13 上使用蓝牙功能,应用需要申请 ACCESS_FINE_LOCATION
或 ACCESS_COARSE_LOCATION
权限,因为蓝牙扫描可能会被用于推断设备的位置信息。
解决方案
-
在
manifest.json
中声明权限: 在uni-app
项目的manifest.json
文件中,确保声明了以下权限:{ "permissions": { "android": [ "android.permission.BLUETOOTH", "android.permission.BLUETOOTH_ADMIN", "android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION" ] } }
-
动态申请定位权限: 在 Android 6.0(API 23)及以上版本中,应用需要在运行时动态申请权限。你可以在
uni-app
中使用uni.authorize
或uni.getSetting
来请求权限。示例代码:
uni.authorize({ scope: 'scope.userLocation', success() { console.log('定位权限已授权'); // 开始蓝牙扫描 startBluetoothScan(); }, fail() { console.log('定位权限未授权'); // 提示用户需要授权定位权限 uni.showModal({ title: '提示', content: '需要授权定位权限才能使用蓝牙功能', success(res) { if (res.confirm) { uni.openSetting({ success(settingRes) { if (settingRes.authSetting['scope.userLocation']) { console.log('定位权限已授权'); // 开始蓝牙扫描 startBluetoothScan(); } } }); } } }); } }); function startBluetoothScan() { uni.startBluetoothDevicesDiscovery({ success(res) { console.log('蓝牙扫描开始', res); }, fail(err) { console.log('蓝牙扫描失败', err); } }); }
-
处理权限拒绝的情况: 如果用户拒绝了定位权限,应用需要处理这种情况,并提示用户重新授权。可以通过
uni.openSetting
引导用户打开设置页面,手动开启权限。
注意事项
-
Android 13 的蓝牙权限:在 Android 13 中,Google 引入了
BLUETOOTH_SCAN
和BLUETOOTH_CONNECT
权限,分别用于蓝牙扫描和连接。如果你的应用目标 SDK 版本为 Android 13 或更高,还需要声明这些权限。{ "permissions": { "android": [ "android.permission.BLUETOOTH_SCAN", "android.permission.BLUETOOTH_CONNECT", "android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION" ] } }