MAUI中如何申请蓝牙BLUETOOTH_SCAN运行时权限?
解决方案:Android BLE 扫描权限申请问题修复
问题根源
Android 12(API 31)及以上版本对BLE权限做了拆分,BLUETOOTH_SCAN、BLUETOOTH_CONNECT 属于NEARBY_DEVICES权限组,是独立的运行时权限。你之前检查的 Permissions.Bluetooth 对应旧版的蓝牙基础权限,不包含扫描/连接的授权,因此即使它被授予,仍会触发权限异常。
步骤1:修正 AndroidManifest.xml 权限配置
确保针对不同API版本配置正确的权限,同时区分是否需要位置关联:
<!-- 适配 API < 31 的旧版本权限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 适配 API 31+ 的权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <!-- 无需位置关联时添加此标志 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 声明支持BLE硬件 --> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
若你的BLE扫描需要结合位置信息(如通过BLE定位),请移除
neverForLocation标志,并保留ACCESS_FINE_LOCATION权限申请。
步骤2:修正运行时权限申请逻辑
直接针对目标API版本申请对应权限,替代之前仅检查旧版蓝牙权限的逻辑(以Xamarin.Android为例):
1. 定义权限数组
string[] requiredPermissions; if (Build.VERSION.SdkInt >= BuildVersionCodes.S) { // Android 12+ 需申请扫描和连接权限 requiredPermissions = new string[] { Manifest.Permission.BluetoothScan, Manifest.Permission.BluetoothConnect }; } else { // 旧版本需申请位置权限(BLE扫描依赖位置) requiredPermissions = new string[] { Manifest.Permission.AccessFineLocation, Manifest.Permission.BluetoothAdmin }; }
2. 检查并申请权限
bool hasAllPermissions = true; foreach (var perm in requiredPermissions) { if (ActivityCompat.CheckSelfPermission(this, perm) != Permission.Granted) { hasAllPermissions = false; break; } } if (!hasAllPermissions) { // 弹出系统权限请求弹窗 ActivityCompat.RequestPermissions(this, requiredPermissions, 1001); } else { // 权限已就绪,执行BLE操作 StartBleScanOrConnect(); }
3. 处理权限申请结果
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) { base.OnRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1001) { bool allGranted = grantResults.All(result => result == Permission.Granted); if (allGranted) { StartBleScanOrConnect(); } else { Toast.MakeText(this, "需授予附近设备权限才能使用BLE功能", ToastLength.Long).Show(); } } }
关键注意事项
- 不要混淆旧版
BLUETOOTH权限与新版BLUETOOTH_SCAN/BLUETOOTH_CONNECT:前者是正常权限无需运行时申请,但不提供扫描/连接权限。 - 手动开启的「附近设备」权限,本质就是系统对
BLUETOOTH_SCAN/BLUETOOTH_CONNECT权限组的统一授权,通过上述代码申请会直接触发对应的系统弹窗。
内容的提问来源于stack exchange,提问作者Denis De Pauli
相关产品推荐
相关产品推荐

