android usb host hid,Android USB Host与HID通讯
前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小.
其中代码之处有些地方需要注意的, 特此注明一下:
/*** USB HOST 连接 HID
*@authorIVAN
**/
public class MainActivity extendsActivity {private static final String TAG = "USB_HOST";privateUsbManager myUsbManager;privateUsbDevice myUsbDevice;privateUsbInterface myInterface;privateUsbDeviceConnection myDeviceConnection;private final int VendorID = 8457; //这里要改成自己的硬件IDprivate final int ProductID = 30264;privateTextView info;privateUsbEndpoint epOut;privateUsbEndpoint epIn;
@Overridepublic voidonCreate(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 voidassignEndpoint() {
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 voidopenDevice() {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 voidfindInterface() {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 voidenumerateDevice() {if (myUsbManager == null)return;
HashMap deviceList =myUsbManager.getDeviceList();if (!deviceList.isEmpty()) { //deviceList不为空
StringBuffer sb = newStringBuffer();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,"枚举设备成功");
}
}
}
}
@Overridepublic booleanonCreateOptionsMenu(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里面添加一句
android usb host hid,Android USB Host与HID通讯相关推荐
- USB学习6---Linux Android USB软件架构设计
下面学习针对高通平台的HS-USB(HS:high speed高速)堆栈(stack)软件架构设计和源代码布局的细节. Android HS-USB堆栈基于下面几点: Gadget driver fr ...
- usb4java android,USB audio on Android platform
这种是android 手机为Host, audio设备为device. 以MSM8x26 android 5.0/5.1 (Lolliop) 为例 1. source code • Kernel k ...
- Android USB audio on Android platform
这种是android手机为Host, audio设备为device. 以MSM8x26 android 5.0/5.1 (Lolliop) 为例1. source code •Kernelkernel ...
- android usb多个,android、windows上多个USB Camera同时使用实验小结
android.windows上多个USB Camera同时使用实验小结 (2013-05-18 19:19:46) 标签: 小结 实验 使用 杂谈 android.windows上多个USB Cam ...
- 安卓USB开发教程 二 USB Host
USB Host(主机模式) 当 Android 设备处于 USB 主机模式时,它充当 USB 主机,为总线供电,并枚举连接的 USB 设备.Android 3.1 及更高版本支持 USB 主机模式. ...
- 安卓USB开发教程 一 USB Host 与 Accessory
安卓通过两种模式:USB Accessory 与 USB Host 模式支持多种 USB 外设与安卓 USB 配件(实现安卓配件协议的硬件).在 USB 配件模式下,外部 USB 硬件充当 USB 主 ...
- Android usb 控制传输,【android之USB通信】android之USB数据传输-Go语言中文社区
因为老板认为wifi连接的方式传输数据太慢,想通过USB传输来实现与硬件的连接,所以通过android客户端作为主设备,终端硬件作为从设备.其中收到数据的处理和 下发设置帧的生成与wifi连接的方式都 ...
- Android 读取外设U盘(USB)文件。
在AndroidManifest文件中添加USB权限 <uses-permission android:name="android.permission.USB_PERMISS ...
- android 9.0 10.0 USB连接模式默认设为MTP
在android系统中,UsbManager调用接口,会binder通信到UsbService.而UsbService又有两个实例,一个 UsbHostManager,一个UsbDeviceManag ...
- S3C2440 WINCE6将USB DEVICE改成USB HOST,实现两个USB HOST
S3C2440一般默认的是一个USB DEVICE,一个USB HOST,即一个主口,一个从口,先来看看USB Device与USB Host相关知识. USB Host: 最底层就是USB Host ...
最新文章
- 解决Ubuntu安装依赖问题
- 5G最完整的PPT教材
- Quartz在Spring中设置动态定时任务 .
- redis 附近的人_Redis GEO地理位置信息,查看附近的人
- Go之十大经典排序算法
- wxWidgets:wxPropertySheetDialog类用法
- 如何为html代码加密
- 视频教程-思科网络工程师CCNP高级路由技术-路由协议
- 第一章 智能体与学习环境
- Git 工具 - 储藏(Stashing) git stash 暂存现在工作区的内容
- 无线上外网,有线上内网的方式
- R语言 quantmod 如何下载汇率
- 花式栈溢出技巧之frame faking
- 超乎认知 认知智能十大黑科技 我国首次对外公布 道翰天琼认知智能
- android录音波浪动画_Android使用音频信息绘制动态波纹
- python爬取豆瓣250排行榜数据
- (jsp一)概述及服务器配置
- ACM-ICPC 2018 南京赛区网络预赛 I. Skr (马拉车+字符串hash/回文自动机)
- python中函数的作用不包括_Python 列表不包含了以下哪个内置函数( )_财经法规答案_学小易找答案...
- configure(configure的中文意思)
热门文章
- 架构和产品的制衡——说说竞价拍卖那点事
- 修改Linux字体出现乱码
- Struts 体系结构与工作原理(图) .
- 一起谈.NET技术,VS2010测试功能之旅:编码的UI测试(2)-操作动作的录制原理(下)...
- aspnet_Users中LastActiveDate的问题
- Asp.net中文件上传下载的简单实现
- webBrowser强制在本窗口打开,禁止在新窗口打开
- ThinkPHP 3.2.3 简单后台模块开发(一)常用配置
- SpringMVC访问静态页面
- javaweb学习总结(二十一)——JavaWeb的两种开发模式