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

.NET Maui多权限(含蓝牙)便捷检查与请求方案求助

解决.NET Maui多权限批量查询/申请及Android 13蓝牙权限支持问题

一、封装通用权限处理工具类(解决代码冗余问题)

把重复的权限检查+请求逻辑封装成通用方法,不管是Maui内置权限还是自定义权限都能复用:

public static class PermissionHelper
{
    // 单个权限的检查与请求
    public static async Task<PermissionStatus> CheckAndRequestPermissionAsync<T>() 
        where T : Permissions.BasePermission, new()
    {
        var status = await Permissions.CheckStatusAsync<T>();
        if (status != PermissionStatus.Granted)
        {
            status = await Permissions.RequestAsync<T>();
        }
        return status;
    }

    // 批量处理多个权限
    public static async Task<Dictionary<Type, PermissionStatus>> CheckAndRequestMultiplePermissionsAsync(params Type[] permissionTypes)
    {
        var results = new Dictionary<Type, PermissionStatus>();
        foreach (var type in permissionTypes)
        {
            if (typeof(Permissions.BasePermission).IsAssignableFrom(type))
            {
                var permission = (Permissions.BasePermission)Activator.CreateInstance(type);
                var status = await Permissions.CheckStatusAsync(permission);
                if (status != PermissionStatus.Granted)
                {
                    status = await Permissions.RequestAsync(permission);
                }
                results.Add(type, status);
            }
        }
        return results;
    }
}

二、自定义Android 13蓝牙权限类(解决Maui无内置支持问题)

Android 13的蓝牙权限分为BLUETOOTH_SCAN、BLUETOOTH_CONNECT、BLUETOOTH_ADVERTISE三类,需要自定义权限类对接平台权限:

// 蓝牙扫描权限
public class BluetoothScanPermission : Permissions.BasePlatformPermission
{
    public override (string androidPermission, bool isRuntime)[] RequiredPermissions =>
        new[] { (Android.Manifest.Permission.BluetoothScan, true) };
}

// 蓝牙连接权限
public class BluetoothConnectPermission : Permissions.BasePlatformPermission
{
    public override (string androidPermission, bool isRuntime)[] RequiredPermissions =>
        new[] { (Android.Manifest.Permission.BluetoothConnect, true) };
}

// 蓝牙广播权限(按需添加)
public class BluetoothAdvertisePermission : Permissions.BasePlatformPermission
{
    public override (string androidPermission, bool isRuntime)[] RequiredPermissions =>
        new[] { (Android.Manifest.Permission.BluetoothAdvertise, true) };
}

同时在Android项目的AndroidManifest.xml中添加权限声明:

<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- 如需广播蓝牙信号,添加以下权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />

三、使用示例

单个蓝牙权限处理

var scanStatus = await PermissionHelper.CheckAndRequestPermissionAsync<BluetoothScanPermission>();
if (scanStatus == PermissionStatus.Granted)
{
    // 执行蓝牙扫描操作
}

批量处理多权限(含蓝牙+内置权限)

var permissionResults = await PermissionHelper.CheckAndRequestMultiplePermissionsAsync(
    typeof(BluetoothScanPermission),
    typeof(BluetoothConnectPermission),
    typeof(Permissions.LocationWhenInUse)
);

// 验证蓝牙权限状态
if (permissionResults[typeof(BluetoothScanPermission)] == PermissionStatus.Granted &&
    permissionResults[typeof(BluetoothConnectPermission)] == PermissionStatus.Granted)
{
    // 蓝牙权限已授权,执行相关操作
}

// 验证位置权限状态
if (permissionResults[typeof(Permissions.LocationWhenInUse)] == PermissionStatus.Granted)
{
    // 位置权限已授权
}

注意事项

  • Android 13中蓝牙权限属于运行时权限,必须动态申请,仅靠Manifest声明无效。
  • 若需扫描蓝牙设备并获取设备名称,除BLUETOOTH_SCAN外,可能还需ACCESS_FINE_LOCATION权限,可直接使用Maui内置的Permissions.LocationWhenInUse。
  • 建议按功能分组申请权限,避免一次性弹出过多授权请求,提升用户体验。

内容的提问来源于stack exchange,提问作者computercarguy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:30:19