android usb Host模式下与usb Hid 设备的通信
做android 与USB HID设备的通信有段时间了,总结一下遇到的问题和解决方法:
1,第一次遇到的问题:android 版本低不支持usb hid,
被要求做相关项目的时候,就从mUsbManager.getDeviceList开始,郁闷了一周,就是返回NULL,从google上查找所有关于android usb的资料,最后才发现,android设备是2.3的不支持android.usb.hardware的包(android3.0之后才支持);
2,第二次:android的etc/permissions没有android.hardware.usb.host.xml权限。
发现版本低之后赶快去买了一个android4.0的设备来测试,发现还是返回NULL。还得从google寻找答案,这篇对我的帮助很大:http://stackoverflow.com/questions/11183792/android-usb-host-and-hidden-devices。最后把设备root了一下在系统文件etc/permissions里面加入权限后OK, mUsbManager.getDeviceList() !=null了。
3,获取需要连接的USB 设备权限
可以参考http://developer.android.com/guide/topics/connectivity/usb/host.html;
获取连接权限有两种方式,在调试过程中就遇到方法一无法连接的问题,还是使用mUsbManager.requestPermission()解决
4,usb hid只能是中断传输,或者控制传输
这个问题纠结很久,因为根据android开发的api Guider使用connection.bulkTransfer(endpoint, bytes, bytes.length,TIMEOUT);无论如何得不到数据。后来在stackoverflow上去翻所有关于android usb hid的文章结果发现说是需要中断传输。
UsbRequest request = new UsbRequest(); Boolean isOpenRequest = request.initialize(connection, mUsbEndpoint); if(isOpenRequest){ request.queue(buffer, buffer.length); if(communication.waitRequest==request){ //do something like as receiver date // 如何这时收到某个数据时需要向设备发送命令则需要使用 controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout) } }
关于controlTransfer的参数的说明可以参考:http://www.csdn++123.com/html/blogs/20130508/10500.htm#6608049-tsina-1-89011-aeef9ead4b41d50c27ea4ebb8e597ac3
下面贴代码:
public class GetUsbDevice extends Activity{ private UsbManager mUsbManager; public UsbDevice mUsbDevice; public UsbInterface mUsbInterface; private UsbEndpoint mUsbEndpoint; public UsbDeviceConnection connection; private ByteBuffer buffer; public static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; private static PendingIntent mPendingIntent; public MyThread usbThread; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); buffer = ByteBuffer.allocate(128); mUsbManager=(UsbManager) getSystemService(Context.USB_SERVICE); mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); registerReceiver(mUsbReceiver, filter); usbThread = new MyThread(); if(getTheTargetDevice!=null){ commWithUsbDevice(); ``` } } /* * 获取product id为1234的设备 * * * @param the target usb device product ID. */ public UsbDevice getTheTargetDevice() { HashMap<String, UsbDevice> usbDeviceList = mUsbManager.getDeviceList(); Iterator<UsbDevice> usbDeviceIterator = usbDeviceList.values() .iterator(); while (usbDeviceIterator.hasNext()) { UsbDevice device = usbDeviceIterator.next(); if (“1234”.equals(device.getProductId() + "")) { mUsbDevice = device; if (!mUsbManager.hasPermission(mUsbDevice)) { mPendingIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0); mUsbManager.requestPermission(mUsbDevice, mPendingIntent); } return mUsbDevice; } } return mUsbDevice; } public void commWithUsbDevice() { if (mUsbDevice.getInterfaceCount() > 0) { mUsbInterface = mUsbDevice.getInterface(0); } if (mUsbInterface != null && mUsbInterface.getEndpointCount() > 0) { mUsbEndpoint = mUsbInterface.getEndpoint(0); } connection = mUsbManager.openDevice(mUsbDevice); if (connection != null) { claim = connection.claimInterface(mUsbInterface, true); if(claim){ usbThread.start(); } } } public class MyThread extends Thread { boolean claim=false; @Override public void run() { super.run(); if (mUsbEndpoint != null) { UsbRequest request = new UsbRequest(); boolean isOpenRequest = request.initialize(connection, mUsbEndpoint); if (isOpenRequest){ boolean isQueueOK = request.queue(buffer, 128); while(true){ if (isQueueOK && connection.requestWait() == request) { } Log.e("", "ggggg" + " " + buffer.get(0) + " " + buffer.get(1) + " " + buffer.get(2) + " " + buffer.get(3) + " " + buffer.get(4) + " " + buffer.get(5) + " " + buffer.get(6) + " " + buffer.get(7)); //向设备发送命令 connection.controlTransfer(0x21, 0x09, 0x300, 0x00, resultOkBuffer2, resultOkBuffer2.length, 100); } } } } BroadcastReceiver mUsbReceiver=new BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbDevice device = intent .getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { if(device!=null){ log.e("","已连接该USB设备“); } } else { Toast.makeText(context, "拒绝连接", Toast.LENGTH_LONG).show(); } } } } }; }
android usb Host模式下与usb Hid 设备的通信的更多相关文章
- Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?
构成ASP.NET Web API核心框架的消息处理管道既不关心请求消息来源于何处,也不需要考虑响应消息归于何方.当我们采用Web Host模式将一个ASP.NET应用作为目标Web API的宿主时, ...
- ASP.NET Web API 框架研究 Self Host模式下的消息处理管道
Self Host模式下的ASP.NET Web API与WCF非常相似,都可以寄宿在任意类型的托管应用程序中,宿主可以是Windows Form .WPF.控制台应用以及Windows Servic ...
- ASP.NET Web API 框架研究 Web Host模式下的消息处理管道
寄宿的作用是开启一个进程为Web API提供一个运行环境以解决持续监听.请求监听和响应回复,即将接收到的请求转换成HttpRequestMessage对象传入管道,并将管道生成并经过处理后的HttpR ...
- Android平台dalvik模式下java Hook框架ddi的分析(2)--dex文件的注入和调用
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77942585 前面的博客<Android平台dalvik模式下java Ho ...
- 烂泥:openvpn tun模式下客户端与内网机器通信
本文由秀依林枫提供友情赞助,首发于烂泥行天下 前两篇文章我们介绍了有关openvpn的搭建与配置文件的讲解,这篇文章我们再聊介绍下,在tun模式下openvpn客户端如何与内网机器通信的问题. 一.实 ...
- 如何忽略usb host 模式设备连接确认对话框
<li class="alt"><span><span>package android.hardware.usb; </span> ...
- Android平台dalvik模式下java Hook框架ddi的分析(1)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/75710411 一.前 言 在前面的博客中已经学习了作者crmulliner编写的, ...
- Android USB Host 通信程序
换到了一家新公司,于是就有了新的项目.这次的项目 要用Android SDK与USB HID设备进行通信.第一次接触Android SDK,以及USB,记录下源程序.开发过程以及一些心得. 首先,要感 ...
- 翻译Android USB HOST API
翻译Android USB HOST API 源代码地址:http://developer.android.com/guide/topics/connectivity/usb/host.html 译者 ...
随机推荐
- db2相关问题及解决方法
DB2相关问题及解决方法: 一.DB2中的代码页(codepage)问题. DB2备份时发生过代码页错误的问题,修改代码页后备份正常,但创建数据库时又发生代码页的错误.这是DB2服务器使用的代码页配置 ...
- C# IO操作(四)大文件拷贝(文件流的使用)、文件编码
大文件拷贝(文件流的使用).文件编码 首先说一下大文件拷贝和文件流,因为计算机的内存资源是有限的,面对几个G甚至更大的文件,需要通过程序来完成拷贝,就需要用到文件流(因为我们无法做到把文件一 ...
- sqlserver中的 数据转换 与 子查询
数据类型转换 --cast转换 select CAST(1.23 as int) select CAST(1.2345 as decimal(18,2)) select CAST(123 as var ...
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
http://www.cnblogs.com/bluestorm/p/3432190.html 问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 下面代码出错的原因,在类中定义的字段为什么不 ...
- 杂技之sharpdevelop调试aps.net
背景: 本人笔记本电脑不给力,vs打开实在太慢,因此考虑使用sharpdevelop,但sharpdevelop有点麻烦事,就是不支持asp.net的调试,为解决此问题,本人在此杂技一把了 方案一: ...
- css 盒子模型理解
盒子模型是html+css中最核心的基础知识,理解了这个重要的概念才能更好的排版,进行页面布局.下面是自己积累和总结的关于css盒子模型的知识^_^,希望对初学者有用. 一.css盒子模型概念 CSS ...
- 双人五子棋对战(需要EasyX图像库)
实训要做项目呐.天天坐在电脑面前累死了.最近题刷的少.大多数都挺水.就不挨个编辑发上来了.发发白天写的项目吧.可能好几天更一下.实训结束恢复正常. 这个游戏需要EasyX的图像库.有兴趣的可以下一个图 ...
- Project Israfil -- 支持多个音乐平台的开源音乐服务
Israfil |关于|当前进度|开发日志|下载软件|编译|参与项目|编译状态|版权|协议| LER0ever Project Israfil Provide Unified Music Se ...
- update语句
[update cicm.cicmodt0702 set msgbody = :1 where msgid between :2 and :3 ] [update cicm.cicmo ...
- 第48条:如果需要精确的答案,请避免使用float和double
float和double主要为了科学计算和工程计算而设计,执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不适合用于需要精确 ...