Android端串口列表无设备问题排查求助(附权限及代码)
USB-TTL转换器Android端识别问题排查
1. 先补全Android权限(最基础要求)
你当前配置的权限完全没覆盖USB相关功能,必须添加以下内容到AndroidManifest.xml:
- 基础USB权限:
<uses-permission android:name="android.permission.USB_PERMISSION" /> <uses-feature android:name="android.hardware.usb.host" android:required="false" />
- 若应用目标Android版本为13及以上,额外补充:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
关键配置:添加USB设备过滤规则
系统需要明确知道你的应用要识别哪些USB设备,因此要在AndroidManifest.xml的<application>标签内加入这段:
<application ...> <!-- 关联USB设备过滤规则文件 --> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/usb_device_filter" /> <!-- 接收USB权限请求和设备连接事件的广播接收器 --> <receiver android:name=".UsbPermissionReceiver" android:exported="true"> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> <action android:name="android.hardware.usb.action.USB_PERMISSION" /> </intent-filter> </receiver> </application>
接着在项目的res/xml目录下新建usb_device_filter.xml文件,填入你使用的USB-TTL转换器的VID和PID(可在Serial USB Terminal中查看设备的具体参数,以下为常见芯片示例):
<?xml version="1.0" encoding="utf-8"?> <resources> <usb-device vendor-id="1a86" product-id="7523" /> <!-- CH340芯片 --> <usb-device vendor-id="067b" product-id="2303" /> <!-- PL2303芯片 --> <!-- 其他设备可继续添加 --> </resources>
2. Qt自带QSerialPort的Android兼容性问题
Windows会自动把USB-TTL映射为系统串口,所以QSerialPortInfo::availablePorts()能正常识别;但Android不会自动做这个映射——USB-TTL属于USB Host设备,Qt原生的QSerialPort不支持直接识别这类设备,必须借助Android的USB Host API来处理。
解决方向:
- 使用第三方Qt库,比如封装了Android USB Host串口功能的
qt-serialport-usb-host,无需自己写JNI代码; - 自行通过JNI调用Android Java代码,手动实现USB设备枚举、权限请求和串口通信(新手不推荐,复杂度较高)。
3. 必须触发动态权限请求
Android 6.0及以上系统,仅在Manifest中声明权限无效,需要弹出对话框让用户手动授权。使用第三方库通常会自动处理权限弹窗;若自行开发JNI,需在检测到USB设备时发送权限请求的Intent。
4. 验证步骤
- 完成所有配置后重新编译安装应用;
- 连接USB-TTL转换器,检查系统是否弹出权限请求弹窗,点击允许;
- 点击应用中的Refresh按钮重新扫描,若仍无法识别,确认
usb_device_filter.xml中的VID/PID与设备实际参数一致。
内容的提问来源于stack exchange,提问作者kancler
相关产品推荐
相关产品推荐

