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

.NET MAUI中如何在Android模拟器上与USB设备通信?

.NET MAUI Android模拟器USB通信调试指南

一、启用模拟器USB调试支持

  • 启动Pixel模拟器,进入设置→系统→开发者选项(若未显示,前往关于手机连续点击版本号7次解锁)
  • 开启USB调试和USB安装选项
  • 在Visual Studio中确认模拟器已被识别,调试目标选择对应Pixel模拟器

二、配置虚拟串口

Android模拟器可通过ADB映射虚拟串口,操作步骤如下:

  1. 打开命令提示符/终端,定位到Android SDK的platform-tools目录(通常路径为C:\Users\[你的用户名]\AppData\Local\Android\Sdk\platform-tools)
  2. 运行adb devices获取模拟器设备ID(例如emulator-5554)
  3. 执行adb -s emulator-5554 emu telnet localhost 5554进入Telnet会话
  4. 在会话中输入redir add tcp:8000:dev/ttyS0(8000为主机端口,ttyS0为模拟器内串口设备,可按需调整)
  5. 输入quit退出Telnet会话
  6. 验证:模拟器内可通过/dev/ttyS0访问虚拟串口,主机端通过本地8000端口与模拟器串口通信

三、MAUI Android USB通信示例

1. 配置Android权限

在Platforms/Android/AndroidManifest.xml中添加:

<uses-permission android:name="android.permission.USB_PERMISSION" />
<uses-feature android:name="android.hardware.usb.host" android:required="false" />

2. USB设备发现与权限请求代码

using Android.Content;
using Android.Hardware.Usb;

public class UsbCommunicationManager
{
    private readonly UsbManager _usbManager;
    private readonly PendingIntent _permissionIntent;
    private const string ActionUsbPermission = "com.yourpackage.USB_PERMISSION";

    public UsbCommunicationManager(Context context)
    {
        _usbManager = (UsbManager)context.GetSystemService(Context.UsbService);
        _permissionIntent = PendingIntent.GetBroadcast(context, 0, new Intent(ActionUsbPermission), PendingIntentFlags.Immutable);
        var filter = new IntentFilter(ActionUsbPermission);
        context.RegisterReceiver(new UsbPermissionReceiver(), filter);
    }

    public void EnumerateUsbDevices()
    {
        var deviceList = _usbManager.DeviceList;
        foreach (var device in deviceList.Values)
        {
            Console.WriteLine($"设备名: {device.DeviceName}, 厂商ID: {device.VendorId}, 产品ID: {device.ProductId}");
            
            if (!_usbManager.HasPermission(device))
            {
                _usbManager.RequestPermission(device, _permissionIntent);
            }
        }
    }
}

public class UsbPermissionReceiver : BroadcastReceiver
{
    public override void OnReceive(Context? context, Intent? intent)
    {
        if (intent?.Action != ActionUsbPermission) return;
        
        lock (this)
        {
            var device = (UsbDevice)intent.GetParcelableExtra(UsbManager.ExtraDevice)!;
            var permissionGranted = intent.GetBooleanExtra(UsbManager.ExtraPermissionGranted, false);
            
            if (permissionGranted)
            {
                Console.WriteLine($"已获取设备 {device.DeviceName} 权限");
                // 此处可添加设备通信逻辑
            }
            else
            {
                Console.WriteLine($"设备 {device.DeviceName} 权限被拒绝");
            }
        }
    }
}

3. 在MAUI页面调用

private void OnListDevicesButtonClicked(object sender, EventArgs e)
{
#if ANDROID
    var context = MauiProgram.Current.Services.GetService<Context>();
    var usbManager = new UsbCommunicationManager(context);
    usbManager.EnumerateUsbDevices();
#endif
}

四、设备发现问题排查

  • 确认模拟器已开启USB调试,且Visual Studio能正常连接
  • 检查AndroidManifest.xml的USB权限是否正确添加
  • 在模拟器中设置USB连接模式为文件传输或MIDI(避免仅充电模式)
  • 运行adb shell ls /dev/bus/usb查看模拟器内USB设备节点,确认设备是否被识别
  • 验证权限请求逻辑:确保广播接收器已注册,模拟器是否弹出权限请求弹窗并被允许

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:23:26