.NET MAUI使用Plugin.BLE遇BLUETOOTH_CONNECT权限异常求助
解决.NET MAUI中Plugin.BLE调用
GetSystemConnectedOrPairedDevices()的SecurityException问题 这个问题核心是Android 12+(API 31及以上)要求动态申请BLUETOOTH_CONNECT危险权限——哪怕你在Manifest里声明了权限,不主动请求用户授权,系统依然会触发权限异常。下面是具体解决步骤:
1. 确认AndroidManifest.xml权限配置完整
确保你已添加适配新旧Android版本的所有必要蓝牙权限:
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <!-- 仅当需要基于位置的蓝牙扫描时添加,获取已配对设备可忽略 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" /> <uses-feature android:name="android.hardware.bluetooth" android:required="true" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />
2. 动态申请BLUETOOTH_CONNECT权限
在调用蓝牙相关方法前,必须先检查并请求权限。用.NET MAUI的Permissions API实现:
using Plugin.BLE; using Plugin.BLE.Abstractions.Contracts; using Microsoft.Maui.ApplicationModel; // 初始化BLE适配器 var adapter = CrossBluetoothLE.Current.Adapter; // 检查并申请蓝牙权限 async Task<bool> CheckAndRequestBluetoothPermissions() { if (OperatingSystem.IsAndroidVersionAtLeast(31)) { // 申请BLUETOOTH_CONNECT权限 var connectStatus = await Permissions.CheckStatusAsync<Permissions.BluetoothConnect>(); if (connectStatus != PermissionStatus.Granted) { connectStatus = await Permissions.RequestAsync<Permissions.BluetoothConnect>(); } // 若后续需要扫描设备,需额外申请BLUETOOTH_SCAN权限 var scanStatus = await Permissions.CheckStatusAsync<Permissions.BluetoothScan>(); if (scanStatus != PermissionStatus.Granted) { scanStatus = await Permissions.RequestAsync<Permissions.BluetoothScan>(); } return connectStatus == PermissionStatus.Granted; } else { // Android 11及以下,蓝牙功能依赖位置权限 var locationStatus = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>(); if (locationStatus != PermissionStatus.Granted) { locationStatus = await Permissions.RequestAsync<Permissions.LocationWhenInUse>(); } return locationStatus == PermissionStatus.Granted; } } // 调用示例 var hasPermissions = await CheckAndRequestBluetoothPermissions(); if (hasPermissions) { try { var devices = await adapter.GetSystemConnectedOrPairedDevicesAsync(); // 处理获取到的设备列表 } catch (Exception ex) { // 处理其他异常(如蓝牙未开启等) } } else { // 提示用户必须授权蓝牙权限才能继续 }
3. 额外注意事项
- 确保使用最新版本的Plugin.BLE(至少v3.0以上),旧版本对Android 12+的权限适配存在缺陷。
- 优先用真实Android设备测试,模拟器的蓝牙功能稳定性较差。
- 若自定义了MainActivity,不要覆盖MAUI默认的权限请求逻辑。
内容的提问来源于stack exchange,提问作者Shubhankar Pande
相关产品推荐
相关产品推荐

