.NET Maui Android平台如何获取USB串口读写权限授权结果?
.NET Maui USB权限请求结果获取方案
问题出在RequestPermission是异步操作,它只会触发系统权限弹窗,不会阻塞当前代码执行,所以你后续的OpenDevice代码会在用户还没授权时就运行,自然拿不到权限。要解决这个问题,得通过广播接收器监听权限授权结果,再在回调里执行设备连接逻辑。
步骤1:实现USB权限广播接收器
创建一个继承自BroadcastReceiver的类,用来接收权限授权结果:
[BroadcastReceiver(Enabled = true)] public class UsbPermissionReceiver : BroadcastReceiver { private readonly Action<bool, UsbDevice> _permissionResultCallback; public UsbPermissionReceiver(Action<bool, UsbDevice> callback) { _permissionResultCallback = callback; } public override void OnReceive(Context context, Intent intent) { string action = intent.Action; if (action == "com.MauiAndroidSerialPort.USB_PERMISSION") { lock (this) { UsbDevice device = (UsbDevice)intent.GetParcelableExtra(UsbManager.ExtraDevice); bool granted = intent.GetBooleanExtra(UsbManager.ExtraPermissionGranted, false); _permissionResultCallback?.Invoke(granted, device); } } } }
步骤2:调整原代码,注册接收器并处理结果
在你的设备连接逻辑中,注册接收器,请求权限后等待回调触发再执行连接:
Activity act = Platform.CurrentActivity; UsbManager manager = (UsbManager)act.GetSystemService(Context.UsbService); UsbDevice dvc = _usbDevice; // 已成功找到的目标设备 string ACTION_USB_PERMISSION = "com.MauiAndroidSerialPort.USB_PERMISSION"; var interf = dvc.GetInterface(1); var outEndpoint = interf.GetEndpoint(1); // 定义权限回调逻辑 void HandlePermissionResult(bool granted, UsbDevice device) { if (granted && device != null) { // 权限授权成功,执行设备连接 var deviceConnection = manager.OpenDevice(device); if (deviceConnection != null) { bool claimed = deviceConnection.ClaimInterface(interf, true); // 这里可以继续处理串口读写逻辑 } } else { // 权限被拒绝,提示用户 Toast.MakeText(act, "USB权限被拒绝,无法连接设备", ToastLength.Short).Show(); } // 注销接收器,避免内存泄漏 act.UnregisterReceiver(_usbPermissionReceiver); } // 创建并注册接收器 UsbPermissionReceiver _usbPermissionReceiver = new UsbPermissionReceiver(HandlePermissionResult); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); act.RegisterReceiver(_usbPermissionReceiver, filter); // 检查权限,无权限则请求 if (!manager.HasPermission(dvc)) { PendingIntent mPermissionIntent = PendingIntent.GetBroadcast(act, 0, new Intent(ACTION_USB_PERMISSION), PendingIntentFlags.Immutable); manager.RequestPermission(dvc, mPermissionIntent); } else { // 已有权限,直接执行连接 HandlePermissionResult(true, dvc); }
注意事项
- 确保
ACTION_USB_PERMISSION的字符串在接收器和请求代码中完全一致 - 在页面销毁或不再需要时,务必注销广播接收器,防止内存泄漏
- 如果是在MAUI的页面中使用,建议在
OnDisappearing生命周期方法中注销接收器
内容的提问来源于stack exchange,提问作者PeNo
相关产品推荐
相关产品推荐

