Android USB Host与HID通讯

前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小.
比较好的文章是:
Android USB Host与HID通讯
其中代码之处有些地方需要注意的, 特此注明一下:
/**
* USB HOST 连接 HID
* @author IVAN
*
*/
public class MainActivity extends Activity {
private static final String TAG = "USB_HOST"; private UsbManager myUsbManager;
private UsbDevice myUsbDevice;
private UsbInterface myInterface;
private UsbDeviceConnection myDeviceConnection; private final int VendorID = 8457; //这里要改成自己的硬件ID
private final int ProductID = 30264; private TextView info; private UsbEndpoint epOut;
private UsbEndpoint epIn; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); info = (TextView) findViewById(R.id.info); // 获取UsbManager
myUsbManager = (UsbManager) getSystemService(USB_SERVICE); enumerateDevice(); findInterface(); openDevice(); assignEndpoint(); } /**
* 分配端点,IN | OUT,即输入输出;此处我直接用1为OUT端点,0为IN,当然你也可以通过判断
*/
//USB_ENDPOINT_XFER_BULK
/*
#define USB_ENDPOINT_XFER_CONTROL 0 --控制传输
#define USB_ENDPOINT_XFER_ISOC 1 --等时传输
#define USB_ENDPOINT_XFER_BULK 2 --块传输
#define USB_ENDPOINT_XFER_INT 3 --中断传输
* */
private void assignEndpoint() {
if (myInterface != null) { //这一句不加的话 很容易报错 导致很多人在各大论坛问:为什么报错呀
//这里的代码替换了一下 按自己硬件属性判断吧
for (int i = 0; i < myInterface.getEndpointCount(); i++) {
UsbEndpoint ep = myInterface.getEndpoint(i);
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT) {
if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
epOut = ep;
} else {
epIn = ep;
}
}
}
}
Log.d(TAG, getString(R.string.text));
} /**
* 打开设备
*/
private void openDevice() {
if (myInterface != null) {
UsbDeviceConnection conn = null;
// 在open前判断是否有连接权限;对于连接权限可以静态分配,也可以动态分配权限,可以查阅相关资料
if (myUsbManager.hasPermission(myUsbDevice)) {
conn = myUsbManager.openDevice(myUsbDevice);
} if (conn == null) {
return;
} if (conn.claimInterface(myInterface, true)) {
myDeviceConnection = conn; // 到此你的android设备已经连上HID设备
Log.d(TAG, "打开设备成功");
} else {
conn.close();
}
}
} /**
* 找设备接口
*/
private void findInterface() {
if (myUsbDevice != null) {
Log.d(TAG, "interfaceCounts : " + myUsbDevice.getInterfaceCount());
for (int i = 0; i < myUsbDevice.getInterfaceCount(); i++) {
UsbInterface intf = myUsbDevice.getInterface(i);
// 根据手上的设备做一些判断,其实这些信息都可以在枚举到设备时打印出来
if (intf.getInterfaceClass() == 8
&& intf.getInterfaceSubclass() == 6
&& intf.getInterfaceProtocol() == 80) {
myInterface = intf;
Log.d(TAG, "找到我的设备接口");
}
break;
}
}
} /**
* 枚举设备
*/
private void enumerateDevice() {
if (myUsbManager == null)
return; HashMap<String, UsbDevice> deviceList = myUsbManager.getDeviceList();
if (!deviceList.isEmpty()) { // deviceList不为空
StringBuffer sb = new StringBuffer();
for (UsbDevice device : deviceList.values()) {
sb.append(device.toString());
sb.append("\n");
info.setText(sb);
// 输出设备信息
Log.d(TAG, "DeviceInfo: " + device.getVendorId() + " , "
+ device.getProductId()); // 枚举到设备
if (device.getVendorId() == VendorID
&& device.getProductId() == ProductID) {
myUsbDevice = device;
Log.d(TAG, "枚举设备成功");
}
}
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
获取数据的代码:
ncount = myDeviceConnection.bulkTransfer(epIn, buffer, buffer.length,
100);
这里注意数据读取的长度, 这个对某些硬件来说非常重要, 有的硬件小了或者大了立马死机重启, 要么就是一直返回-1
这个数据的长度需要根据硬件属性来,
有一种办法是通过int inMax = epIn.getMaxPacketSize()来获取;
还有一种办法是通过windows下面的hid程序探测设备的数据长度;
至于读不到硬件的问题 我觉得以下办法不会有帮助了, 要么是硬件不支持, android4.0以上 貌似都包含了以下的文件信息了
将android.hardware.usb.host.xml文件放到/system/etc/permissions下;第二处是在同目录下的handheld_core_hardware.xml里面添加一句<feature name="android.hardware.usb.host">
Android USB Host与HID通讯的更多相关文章
- Android USB Host与HID通讯 (二)
不好意思,从上一篇到现在确实比较忙,中间又外出了一段时间,虽然也上LOFTER,或者看到一些朋友QQ上加我,给我发信息询问,有些看到了有些可能没看到,偶尔回复了一两个,也不咋的详细,在此我想说,一方面 ...
- Android USB Host与HID通讯 (一)
去年9月份来到现在的公司,接到新公司的第一个项目就是Android USB Host与HID通讯,当时也什么都不懂,就拿着google的api 开发指南 (http://developer.andro ...
- Android USB Host 与 HID 之通讯方法
Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两个方法,要实现真正的通 ...
- Android USB Host 与 HID 之通讯方法(bulkTransfer()与controlTransfer()方法使用)
转载地址:差满多乃几 Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两 ...
- Android USB Host 与 Hid 设备通信bulkTransfer()返回-1问题的原因
近期一直在做Android USB Host 与USB Hid设备(STM32FXXX)的通信,遇到了很多问题.项目源码以及所遇到的其他问题可以见本博客其他相关文章,这里重点讲一下bulkTransf ...
- 翻译Android USB HOST API
翻译Android USB HOST API 源代码地址:http://developer.android.com/guide/topics/connectivity/usb/host.html 译者 ...
- android usb Host模式下与usb Hid 设备的通信
做android 与USB HID设备的通信有段时间了,总结一下遇到的问题和解决方法: 1,第一次遇到的问题:android 版本低不支持usb hid, 被要求做相关项目的时候,就从mUsbMana ...
- Android USB Host 通信程序
换到了一家新公司,于是就有了新的项目.这次的项目 要用Android SDK与USB HID设备进行通信.第一次接触Android SDK,以及USB,记录下源程序.开发过程以及一些心得. 首先,要感 ...
- android usb host 读写USB设备
自android3.1以后android增加了操作USB设备的API. 官网地址:http://developer.android.com/guide/topics/connectivity/usb/ ...
随机推荐
- ios 开发中使用SVN管理代码
今天新公司需要使用SVN管理代码,就在网上查看相关的资料,现在把相关用法记录下来: 1.使用的是这个软件Cornerston 网上有很多相应的下载链接,可以去查看 2.下载安装之后,首先需要添加仓库r ...
- js入门篇之正则表达式基础
定义:正则用于规定在文本中检索的内容,它是对字符串执行模式匹配的强大工具 RegExp(正则表达式) 对象的语法: new RegExp(pattern, attributes); pattern为一 ...
- matlab函数大全
Matlab 图像处理相关函数命令大全 一.通用函数: colorbar 显示彩色条 语法:colorbar \ colorbar('vert') \ colorbar('horiz') \ col ...
- PXE DHCP获取IP与传统DHCP获取IP地址的区别
正常的DHCP获取IP的流程(Discover-Offer-Request-Ack): (Discovery)主机端在LAN中发布MAC地址为FF:FF:FF:FF:FF:FF的广播来寻找DHCP服务 ...
- 外部函数test显示的返回内部函数add的调用
前段时间有个需求中有点击datagrid的单元格实现某种事件,皇冠现金代理调用datagrid的onclickCell这个方法很容易实现,但是体验不好啊,完全不知道自己刚才点击的是哪个单元格,然后就尝 ...
- 真机测试及布署Code Sign error问题总结
Code Sign error: Certificate identity 'iPhone Developer: idf (XR9HN3TD7E)' appears more than once in ...
- SQL编码乱码解决方法
摘自 http://www.cnblogs.com/keke/archive/2011/08/05/2128557.html 使用SQL SERVER2005的时候常常遇到中文字符为乱码的情况,经过研 ...
- Java 的静态代理 动态代理(JDK和cglib)
转载:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是 ...
- a 添加href后当前栏目如何高亮显示
//nav $(".nav li a").each(function() { $this = $(this); if ($this[0].href == String(window ...
- windows下面配置apache+http
一.apache安装 下载并安装apache_2.2.9-win32-x86-openssl-0.9.8h-r2.msi(见附件),找到apache安装目录(C:\Program Files (x86 ...