原文出处:http://han21912.lofter.com/post/c3919_3f87b6

去年9月份来到现在的公司,接到新公司的第一个项目就是Android USB Host与HID通讯,当时也什么都不懂,就拿着google的api 开发指南

(http://developer.android.com/guide/topics/connectivity/usb/host.html)反复的阅读反复的实验,网上的资料也只能发现/枚举到U盘等设备,进行HID通讯、数据传输的资料很少,当时老大给我的时间是整整一个月,听到这我说:我尽量…

因为当时发了一两篇博文(Android USB Host 与 HID 通讯方法),最近有些Android开发攻城师在我的博客问,说具体要怎么做,如何处理?但最近手上有一大堆TabletSystem Bug,下班后再也不想继续,就一直没怎么回复,今天周六公司调班,想干点别的,就跟大家一起交流交流Android USB Host与HID 通讯。

首先,大家如果想了解啥是USB Host,那大家还是自己去学习学习吧,多看些一手的资料,别总是穿二手鞋(这是前辈对我的忠告)。跟我之前一样完全不知道Android USB Host的可以反复阅读下上面提到的google api 开发指南,我是反复的看了一遍又一遍,中文的英文的(英文有点戳),除了Host外,还有个Accessory,感兴趣的都可以了解下。。

其次,当时公司给我的HID设备既有需要驱动的也有无驱的,而公司给我的板子没有相应的驱动。只能发现无驱HID,若要发现有驱动的HID设备则需要另加上相应的设备驱动,否则你将无法发现你的HID设备。至于,怎么添加相应的驱动,这就需要请教写驱动的攻城师同胞,暂时还未向这方面发展,以后有机会可以横向发展下。

先看看AndroidManifest.xml文件,对于刚接触最好从简单入手,在AndroidManifest.xml中加上intent-filter过滤器,可以先不做请求权限的处理,因为intent-filter方式可以自动请求权限。

1)添加USB HOST权限

<!-- USB HOST -->
<uses-featureandroid:name="android.hardware.usb.host"/>

2)添加意图过滤器,并配置自己的资源文件指定USB设备的属性,而资源文件为一个xml文件,如:device_filter.xml

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

3)对于资源文件device_filter.xml,需要配置设备的product-id 和vendor-id,如下:

<resource>
<usb-deviceproduct-id="5635"vendor-id="5398"/>
</resource>

接下来就是java代码,主要包括:枚举设备->找到设备的接口->连接设备->分配相应的端点->在IN端点进行读操作,在OUT端点进行写操作。在此可以不做请求权限处理,因为意图过滤器已经帮我们做了,若要进行动态请求权限的可以在此基础上再做扩展。

1)获取USB管理器,若获取失败,return。

mUsbManager =(UsbManager) context.getSystemService(Context.USB_SERVICE);
if(mUsbManager ==null){
return;
}

2)枚举Host上所有的HID设备,存入一个列表,若列表不为空,枚举到设备,可以用getVendorId()和getProductId()方法获取到设备的VendorId和ProductId,可继续找设备的UsbInterface;若列表为空,未枚举到设备。

HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
if(!deviceList.isEmpty()){
for(UsbDevice device : deviceList.values()){
if(device.getVendorId()== VendorID && device.getProductId()==ProductID){
mUsbDevice = device;
//找到Device接口并分配相应端点
findIntfAndEpt();
}else{
Toast.makeText(context,"NotFind VID and PID",Toast.LENGTH_SHORT).show();
}
}
}else{
newAlertDialog.Builder(context).setTitle("未枚举到设备!")
.setMessage("请先连接设备,再重启程序。。")
.setCancelable(false)
.setNeutralButton("确定",newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterface dialog,intwhich){
//finish();
}
}).show();
}

到此为止,就可以发现你的HID外设,后面的我抽时间尽快补上,主要流程还是:枚举设备->找到设备的接口->连接设备->分配相应的端点->在IN端点进行读操作,在OUT端点进行写操作

更多相关文章

  1. Android(安卓)ADB详细介绍及用法
  2. 移动设备浏览器的缓存限制[转][Mobile Browser Cache Limits: An
  3. 设备管理器权限- Android
  4. Secure Software Installation on Smartphones 笔记
  5. 正确获得android设备的IP地址
  6. android APK 调用G—sensor驱动的过程
  7. Android(安卓)Bluetooth 蓝牙基本操作
  8. Android(安卓)6.0 变更
  9. 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)

随机推荐

  1. Android(安卓)JNI环境搭建及开发入门
  2. [Android]Android数据的四种存储方式
  3. RK3288 Android(安卓)7.1 屏蔽“您的设备
  4. Android(安卓)Contacts的使用(三)
  5. Android之Service学习篇一:Service启动方
  6. Android之Input子系统事件分发流程
  7. Android(安卓)中Activity,Window和View之
  8. Android(安卓)中文 API (36) —— Toast
  9. eclipse android安装
  10. android framework 层服务 分析