You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:36:15