求解:android 4.0读写HID设备

MyMitac 2012-04-13 10:42:31
大家好,从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;
}
}
}
...全文
2322 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
c_zhao 2014-01-17
  • 打赏
  • 举报
回复
chmod -R 777 /dev/bus/usb/
六爷是我 2014-01-16
  • 打赏
  • 举报
回复
我这边也是这个问题,楼主啊,求解决之道啊
fanszheqq 2013-10-24
  • 打赏
  • 举报
回复
楼主 解决没有啊 同欲同求啊@!!@
sckalman 2013-06-27
  • 打赏
  • 举报
回复
楼主 问题解决了么? HID设备不会被MOUNT成指定文件,所以应用层无法访问。????? 我测试了下hid 设备在 dev/bus/usb 下也会mount 成文件的
mingyunzzu 2013-02-19
  • 打赏
  • 举报
回复
可能还是设备节点权限的问题。我后来找了其他目录下的设备节点就可以。你可以找一下/dev、/sys、/proc下usb设备对应的设备节点。一个一个试试将权限改为all users可读可写后是否可以读写成功。有时候可能还会在子目录中。
sunfish_iris 2012-12-29
  • 打赏
  • 举报
回复
求关注, 求关注... 赶紧来人给解决问题啊.
findsafety 2012-12-28
  • 打赏
  • 举报
回复
引用 3 楼 mingyunzzu 的回复:
你好,我是使用ndk的方法在2.2上可以,但是在4.0上使用libusb库方式读取数据还是提示文件权限不够 libusb_open 返回值为-3,查了一下为 LIBUSB_ERROR_ACCESS if the user has insufficient permissions 还是权限的问题
请问你现在知道在4.0要怎么做了吗?
findsafety 2012-12-28
  • 打赏
  • 举报
回复
引用 4 楼 yuch371 的回复:
解决 读USB节点为空的问题: 1.新建: android.hardware.usb.host.xml 内容: <?xml version="1.0" encoding="utf-8"?> <permissions> <feature name="android.hardware.usb.host" /> </permissions> 文件送到 终……
他这根本就不是说读不到USB的问题,而是说鼠标、键盘等不能被系统作为USB识别出来,所以getDeviceList是空的 我也遇到了这个问题,请问LZ现在解决了吗?用NDK来调用linux库可以实现不? 急切盼望回答
牧晨 2012-08-04
  • 打赏
  • 举报
回复
解决 读USB节点为空的问题:
1.新建: android.hardware.usb.host.xml
内容: <?xml version="1.0" encoding="utf-8"?>
<permissions>
<feature name="android.hardware.usb.host" />
</permissions>

文件送到 终端设备的: /system/etc/permissions 目录下
送后需要重新启动设备才有效。

2.修改安卓主配置文件 AndroidManifest.xml

在对应位置添加 :
<uses-sdk android:minSdkVersion="14" />
<uses-feature android:name="android.hardware.usb.host" android:required="true"/>
<!-- android:required="true" -->

</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" >
</meta-data>

</activity>

3.在res\xml下添加 device_filter.xml 文件
文件内容:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="3" product-id="2" />
</resources>
其中:的3和2 为对应的值,如果知道,可以从节点列表中读出,填写正确后,android层能接收到对应的插入或拔出消息。

4.祝你好运
mingyunzzu 2012-07-20
  • 打赏
  • 举报
回复
你好,我是使用ndk的方法在2.2上可以,但是在4.0上使用libusb库方式读取数据还是提示文件权限不够
libusb_open 返回值为-3,查了一下为 LIBUSB_ERROR_ACCESS if the user has insufficient permissions
还是权限的问题
ppcst 2012-05-11
  • 打赏
  • 举报
回复
我觉的你直接用android的USB接口不行的话,可以试试使用NDK,直接调用linux的API来打开HID的文件节点,这个文件节点应该是在/dev/usb/目录下;
MyMitac 2012-04-13
  • 打赏
  • 举报
回复
有遇到类似问题的吗?

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧