求解:android 4.0读写HID设备
大家好,从3.1开始,android设备已经可以作为HOST端了,并且官方提供一套访问USB的API。
我需要在Android 4.0下用官方的USB API读写外部USB设备。
测试环境:
手机:三星9250
系统:android 4.0
外接设备:U盘,鼠标,键盘
参考官方代码,我写了一个读取USB设备的小应用。
经过验证,只有U盘能够被应用层正确读写,而HID设备根本无法被获取。
目前,我个人推断是USB设备在KERNEL中被MOUNT成指定的文件。
UsbManager就是去枚举这些文件。
HID设备不会被MOUNT成指定文件,所以应用层无法访问。
不知道各位是否有做过类似的开发,能否给我点提示。
附测试代码:
private void UsbInit()
{
Intent intent = getIntent();
mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
if(mUsbManager == null)
{
Toast.makeText(this,
"USB manager is not OK",
Toast.LENGTH_LONG).show();
return ;
}
//mUsbDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
// check for existing devices
for (UsbDevice device : mUsbManager.getDeviceList().values()) {
if (device != null)
{
mUsbDevice = device;
break;
}
}
if(mUsbDevice == null)
{
Toast.makeText(this,
"USB is not OK",
Toast.LENGTH_LONG).show();
return;
} else {
String tmp = "vid is ";
tmp = tmp + Integer.toHexString(mUsbDevice.getVendorId()) + ".";
tmp = tmp + "pid is ";
tmp = tmp + Integer.toHexString(mUsbDevice.getProductId()) + ".";
Toast.makeText(this, tmp, Toast.LENGTH_LONG).show();
}
if (mUsbDevice.getInterfaceCount() != 1) {
Log.e(TAG, "could not find interface");
return;
}
UsbInterface intf = mUsbDevice.getInterface(0);
// device should have one endpoint
if (intf.getEndpointCount() < 1) {
Log.e(TAG, "could not find endpoint");
return;
}
// endpoint should be of type interrupt
UsbEndpoint ep = intf.getEndpoint(2);
if (ep.getType() != UsbConstants.USB_ENDPOINT_XFER_INT) {
Log.e(TAG, "endpoint is not interrupt type");
return;
}
mEndpointIntr = ep;
if (mUsbDevice != null) {
UsbDeviceConnection connection = mUsbManager.openDevice(mUsbDevice);
if (connection != null && connection.claimInterface(intf, true)) {
Log.d(TAG, "open SUCCESS");
mConnection = connection;
Thread thread = new Thread(this);
thread.start();
} else {
Log.d(TAG, "open FAIL");
mConnection = null;
}
}
}