.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
相关产品推荐
相关产品推荐

