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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:07:50