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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:40:03