版权声明:本文为博主原创文章,未经博主允许不得转载。
背景介绍:
老大忽然跟我说:今天你做一个东西,能确保我们的usb外设发送的数据能被接受到。
然而,作为一个android零基础 的小白(初创公司真是身兼多职~。~),只能各种找资料,最后 ac了。
一、查找大概的代码:
在activity下开一个线程,传usbManager,代码如下:
- <span style="font-size:18px;">package com.example.administrator.acceptusbdata;
- import android.content.Context;
- import android.hardware.usb.UsbDevice;
- import android.hardware.usb.UsbManager;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.util.Log;
- import java.util.HashMap;
- import java.util.Iterator;
- public class MainActivity extends AppCompatActivity{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- final String TAG = "onCreate";
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- UsbManager usbManager = (UsbManager)getSystemService(Context.USB_SERVICE); //getSystemService只能在activity下使用
- new Thread(new MyThread(1,usbManager)).start(); //启动线程
- }
- }
- </span>
<span style="font-size:18px;">package com.example.administrator.acceptusbdata;
import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.HashMap;
import java.util.Iterator;
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
final String TAG = "onCreate";
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UsbManager usbManager = (UsbManager)getSystemService(Context.USB_SERVICE); //getSystemService只能在activity下使用
new Thread(new MyThread(1,usbManager)).start(); //启动线程
}
}
</span>
- package com.example.administrator.acceptusbdata;
- import android.content.Context;
- import android.hardware.usb.UsbDevice;
- import android.hardware.usb.UsbDeviceConnection;
- import android.hardware.usb.UsbEndpoint;
- import android.hardware.usb.UsbInterface;
- import android.hardware.usb.UsbManager;
- import android.hardware.usb.UsbRequest;
- import android.util.Log;
- import java.nio.ByteBuffer;
- import java.util.HashMap;
- import java.util.Iterator;
- /**
- * Created by Administrator on 2016/9/28 0028.
- */
- public class MyThread implements Runnable {
- int count=1,number;
- UsbManager mUsbManager;
- public MyThread(int num,UsbManager usbManager)
- {
- number=num;
- System.out.println("创建线程"+number);
- mUsbManager = usbManager;
- }
- public void run() {
- while (true) {
- System.out.println("线程" + number + ":计数" + count);
- HashMap<String,UsbDevice> deviceHashMap = mUsbManager.getDeviceList();
- Iterator<UsbDevice> iterator = deviceHashMap.values().iterator();
- System.out.println("deviceHashMap.isEmpty()"+deviceHashMap.isEmpty());
- while(iterator.hasNext()) {
- UsbDevice usbDevice = iterator.next();
- UsbInterface usbInterface = usbDevice.getInterface(0);//USBEndpoint为读写数据所需的节点
- UsbEndpoint inEndpoint = usbInterface.getEndpoint(0); //读数据节点
- UsbDeviceConnection connection = mUsbManager.openDevice(usbDevice);
- connection.claimInterface(usbInterface, true);
- //发送数据
- byte[] byte2 = new byte[1024];
- //读取数据1 两种方法读取数据
- int ret = connection.bulkTransfer(inEndpoint, byte2, byte2.length, 3000);
- System.out.println("ret");
- Log.i("ret", "ret:" + ret);
- Log.i("ret", "bat is ok length:" + byte2.length);
- for (Byte byte1 : byte2) {
- Log.i("ret", "byte1 :" + byte1);
- }
- }
- }
- }
- }
package com.example.administrator.acceptusbdata;
import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbRequest;
import android.util.Log;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Iterator;
/**
* Created by Administrator on 2016/9/28 0028.
*/
public class MyThread implements Runnable {
int count=1,number;
UsbManager mUsbManager;
public MyThread(int num,UsbManager usbManager)
{
number=num;
System.out.println("创建线程"+number);
mUsbManager = usbManager;
}
public void run() {
while (true) {
System.out.println("线程" + number + ":计数" + count);
HashMap<String,UsbDevice> deviceHashMap = mUsbManager.getDeviceList();
Iterator<UsbDevice> iterator = deviceHashMap.values().iterator();
System.out.println("deviceHashMap.isEmpty()"+deviceHashMap.isEmpty());
while(iterator.hasNext()) {
UsbDevice usbDevice = iterator.next();
UsbInterface usbInterface = usbDevice.getInterface(0);//USBEndpoint为读写数据所需的节点
UsbEndpoint inEndpoint = usbInterface.getEndpoint(0); //读数据节点
UsbDeviceConnection connection = mUsbManager.openDevice(usbDevice);
connection.claimInterface(usbInterface, true);
//发送数据
byte[] byte2 = new byte[1024];
//读取数据1 两种方法读取数据
int ret = connection.bulkTransfer(inEndpoint, byte2, byte2.length, 3000);
System.out.println("ret");
Log.i("ret", "ret:" + ret);
Log.i("ret", "bat is ok length:" + byte2.length);
for (Byte byte1 : byte2) {
Log.i("ret", "byte1 :" + byte1);
}
}
}
}
}
参考链接:http://blog.csdn.net/centralperk/article/details/9312401
二、getDeviceList()搜索不到设备
在以上基础下,遇到一个问题:getDeviceList()搜索不到设备:
然后参考链接中的方法解决了,不过其中push文件到android设备、编辑andoird文件等操作 都是同事帮着完成的~毕竟android小白。。
三、系统签名
当时装上后报错说权限不够,同事帮给app签名后就ok了。
至此就能搜索到设备了。但是接受数据还有问题,后面发现是byte数组开小了,usb外设是直接发一个包过来的,包的size 比数组大就直接不存进去(而不是覆盖存入),改了byte数组大小就success了。
最后附上两个参考链接,帮助理解api:
http://home.bdqn.cn/thread-67074-1-1.html
https://developer.android.com/reference/android/hardware/usb/package-summary.html