Android手机如何检测非标准USB设备?两类广播无响应求解
先帮你理清楚当前的设备情况和遇到的检测困境:
设备配置详情
- 属于非标准USB设备
- 通过ID引脚接地,仅使用手机5V电源供电
- 用1.5k上拉电阻将D-引脚连接至5V,意图传递电压变化信号
- 不使用D+/D-引脚与手机通信
遇到的核心问题
你尝试监听两个系统广播来检测设备插入:
UsbManager.ACTION_USB_DEVICE_ATTACHEDandroid.hardware.usb.action.USB_STATE
但两者都没有触发变化,而插入普通USB线时,android.hardware.usb.action.USB_STATE会正常变为connected。
为什么这两个广播不工作?
关于
UsbManager.ACTION_USB_DEVICE_ATTACHED
这个广播是Android系统针对符合USB规范的标准设备发送的——系统会对插入的设备进行枚举,读取它的VID/PID、设备类等信息,确认是合法USB设备后才会触发这个广播。你的设备完全没有实现USB设备的枚举逻辑,也不属于任何标准USB设备类,系统根本不会把它识别为一个“USB设备”,自然不会发送这个广播。关于
android.hardware.usb.action.USB_STATE
这个广播反映的是USB端口的整体连接状态,普通USB线(比如充电线、数据线上)的D+/D-引脚通常有标准的连接方式(比如充电线会短接D+和D-,数据线会有对应的上拉电阻),手机的充电管理模块会通过这些引脚的状态判断“有USB设备接入”。而你的设备只单独给D-加了上拉,不符合手机预设的USB连接检测逻辑,所以系统没判定端口状态发生了变化。
可行的检测方案
根据你的设备需求,给你几个实际的解决思路:
1. 通过充电电流变化检测
因为你的设备只从手机取5V供电,插入后手机的输出电流会明显增加。你可以通过BatteryManager的广播来监听这个变化:
- 注册
Intent.ACTION_BATTERY_CHANGED广播 - 从广播的
Intent中获取EXTRA_CURRENT_NOW(当前电池电流,负数表示放电,正数表示充电)或者EXTRA_CHARGE_COUNTER(电池电量计数)的数值变化 - 当数值出现突变时,判断你的设备已经插入
这种方法不需要修改硬件,只需要APP权限,是最容易实现的方案。
2. 硬件级引脚监听(需Root/定制ROM)
如果需要精确检测D-引脚的电压变化,那得获取硬件访问权限:
- 在Root过的设备上,你可以尝试读取对应D-引脚的GPIO节点文件(路径通常类似
/sys/class/gpio/gpioX/value),实时监听状态变化 - 或者定制Android ROM,添加一个简单的驱动模块来监听D-引脚的电压变化,然后发送自定义广播通知你的APP
这个方案门槛较高,需要对Android底层有一定了解。
3. 修改硬件,模拟标准USB设备
如果可以调整硬件,推荐你添加一个廉价的USB HID芯片(比如CH340、PIC16F系列的简单HID模块),让你的设备被识别为标准的HID设备(比如虚拟键盘、鼠标)。这样系统会自动触发UsbManager.ACTION_USB_DEVICE_ATTACHED广播,你的APP可以通过UsbManager获取设备信息,实现检测。
内容的提问来源于stack exchange,提问作者lukeluck

