.NET MAUI中如何在Android模拟器上与USB设备通信?
.NET MAUI Android模拟器USB通信调试指南
一、启用模拟器USB调试支持
- 启动Pixel模拟器,进入设置→系统→开发者选项(若未显示,前往关于手机连续点击版本号7次解锁)
- 开启USB调试和USB安装选项
- 在Visual Studio中确认模拟器已被识别,调试目标选择对应Pixel模拟器
二、配置虚拟串口
Android模拟器可通过ADB映射虚拟串口,操作步骤如下:
- 打开命令提示符/终端,定位到Android SDK的
platform-tools目录(通常路径为C:\Users\[你的用户名]\AppData\Local\Android\Sdk\platform-tools) - 运行
adb devices获取模拟器设备ID(例如emulator-5554) - 执行
adb -s emulator-5554 emu telnet localhost 5554进入Telnet会话 - 在会话中输入
redir add tcp:8000:dev/ttyS0(8000为主机端口,ttyS0为模拟器内串口设备,可按需调整) - 输入
quit退出Telnet会话 - 验证:模拟器内可通过
/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
相关产品推荐
相关产品推荐

