做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 设备的通信的更多相关文章

  1. Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?

    构成ASP.NET Web API核心框架的消息处理管道既不关心请求消息来源于何处,也不需要考虑响应消息归于何方.当我们采用Web Host模式将一个ASP.NET应用作为目标Web API的宿主时, ...

  2. ASP.NET Web API 框架研究 Self Host模式下的消息处理管道

    Self Host模式下的ASP.NET Web API与WCF非常相似,都可以寄宿在任意类型的托管应用程序中,宿主可以是Windows Form .WPF.控制台应用以及Windows Servic ...

  3. ASP.NET Web API 框架研究 Web Host模式下的消息处理管道

    寄宿的作用是开启一个进程为Web API提供一个运行环境以解决持续监听.请求监听和响应回复,即将接收到的请求转换成HttpRequestMessage对象传入管道,并将管道生成并经过处理后的HttpR ...

  4. Android平台dalvik模式下java Hook框架ddi的分析(2)--dex文件的注入和调用

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77942585 前面的博客<Android平台dalvik模式下java Ho ...

  5. 烂泥:openvpn tun模式下客户端与内网机器通信

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 前两篇文章我们介绍了有关openvpn的搭建与配置文件的讲解,这篇文章我们再聊介绍下,在tun模式下openvpn客户端如何与内网机器通信的问题. 一.实 ...

  6. 如何忽略usb host 模式设备连接确认对话框

    <li class="alt"><span><span>package android.hardware.usb;  </span> ...

  7. Android平台dalvik模式下java Hook框架ddi的分析(1)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/75710411 一.前 言 在前面的博客中已经学习了作者crmulliner编写的, ...

  8. Android USB Host 通信程序

    换到了一家新公司,于是就有了新的项目.这次的项目 要用Android SDK与USB HID设备进行通信.第一次接触Android SDK,以及USB,记录下源程序.开发过程以及一些心得. 首先,要感 ...

  9. 翻译Android USB HOST API

    翻译Android USB HOST API 源代码地址:http://developer.android.com/guide/topics/connectivity/usb/host.html 译者 ...

随机推荐

  1. asp.net 音乐播放器

    <HTML> <HEAD><TITLE>Playback Example</TITLE> </HEAD> <BODY> < ...

  2. 02_HttpClient_Get请求

    [实例1. GET请求百度(乱码)] /** * Http GET请求百度,但是返回乱码 */ public static void main(String[] args) throws Except ...

  3. VC++ CTime Format 详解

    参考链接: VC++中CTime类Format参数详解 CTime/COleDateTime::Format方法的使用 http://stat.ethz.ch/R-manual/R-devel/lib ...

  4. TreeMap 红黑树实现

    TreeMap 是一个有序的key-value集合,它是通过 红黑树 实现的. TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合. TreeMap 实现了 ...

  5. linux定时执行php脚本

    1.查看lynx命令所在的路径 whereis lynx 或者 which lynx 如果没有,则安装 yum install lynx 或者 apt-get方式(ubuntu) 2.建立 shell ...

  6. ajax、json一些整理(1)

    1.请求text数据,在success事件中手动解析 前台:                 $.ajax({                     type: "post", ...

  7. oracle创建job方法

    oracle创建job方法  alter system enable restricted session;--创建表create table G_TEST ( ID     NUMBER(12), ...

  8. java集合——进度1

    集合类的由来:    对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定.    就使用集合容器进行存储.    集合特点:1,用于存储对象的容器.2,集合的长度是可变的.3,集合中不可以存 ...

  9. 网站重构-你了解AJAX吗?

    AJAX是时下最流行的一种WEB端开发技术,而你真正了解它的一些特性吗?--IT北北报 XMLHTTPRequest(XHR)是目前最常用的技术,它允许异步接收和发送数据,所有的主流浏览器都对它有不错 ...

  10. PHP中如何设置error_reporting错误报告级别

    错误报告级别:指定了在什么情况下,脚本代码中的错误(这里的错误是广义的错误,包括E_NOTICE注意.E_WARNING警告.E_ERROR致命错误等)会以错误报告的形式输出.   设置错误报告级别的 ...