1、前言
之前公司项目,一台外接设备,通过usb接入到android平板上,不得不去看了一下相关的api,自己做了一个简单的封装。
2、关于配置
没啥配置。
也查询了其他博客,都是要在Manifest里面添加uses-feature和过滤之类的,其实这不是必要的。
3、相关api
不多说了,直接上谷歌官方解释:
https://developer.android.google.cn/reference/android/hardware/usb/package-summary.html
4、自己封装的工具类
对usb相关操作做了简单的封装,可以直接复制使用
public class USBConnectionManager{
private UsbManager manager;
// 找到的USB设备
private UsbDevice mUsbDevice;
private UsbInterface mInterface;
// 代表一个接口的某个节点的类:写数据节点
private UsbEndpoint usbEpOut;
// 代表一个接口的某个节点的类:读数据节点
private UsbEndpoint usbEpIn;
private UsbDeviceConnection mDeviceConnection;
private final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
private OnUSBInitListener mOnUSBInitListener;
public USBConnectionManager(Context context, int vID, int pID, OnUSBInitListener onUSBInitListener) {
this.mOnUSBInitListener = onUSBInitListener;
manager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
// 根据硬件id寻找设备
while (deviceIterator.hasNext()) {
UsbDevice device = deviceIterator.next();
if ((device.getVendorId() == vID && device.getProductId() == pID)) {
mUsbDevice = device;
break;
}
}
if (mUsbDevice != null) {
// 代表USB设备的一个接口,这里0代表第一个接口,如果想知道设备有几个接口,可以调用mUsbDevice.getInterfaceCount()查询
mInterface = mUsbDevice.getInterface(0);
if (mInterface != null) {
if (mInterface.getEndpoint(0) != null) {
usbEpIn = mInterface.getEndpoint(0);
}
if (mInterface.getEndpoint(1) != null) {
usbEpOut = mInterface.getEndpoint(1);
}
// 判断是否有权限
if (manager.hasPermission(mUsbDevice))
getConnection();
else {
// 申请权限
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
filter.addAction(ACTION_USB_PERMISSION);
context.registerReceiver(receiver, filter);
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(context, 0,
new Intent(ACTION_USB_PERMISSION), 0);
manager.requestPermission(mUsbDevice, mPermissionIntent);
}
} else
onUSBInitListener.error(OnUSBInitListener.NOT_FOUND_USBINTERFACE);
} else
onUSBInitListener.error(OnUSBInitListener.NOT_FOUND_DEVICE);
}
public int read(byte[] data) {
return mDeviceConnection.bulkTransfer(usbEpIn, data, data.length, 3000);
}
public void write(byte[] data) {
mDeviceConnection.bulkTransfer(usbEpOut, data, data.length, 3000);
}
public void close() {
if (mDeviceConnection != null && mInterface != null) {
mDeviceConnection.releaseInterface(mInterface);
mDeviceConnection.close();
}
}
private void getConnection() {
// 打开设备,获取 UsbDeviceConnection 对象,连接设备,用于后面的通讯
mDeviceConnection = manager.openDevice(mUsbDevice);
if (mDeviceConnection == null) {
mOnUSBInitListener.error(OnUSBInitListener.OPEN_DEVICE_FAILURE);
}
}
public interface OnUSBInitListener {
final int NOT_FOUND_DEVICE = -1;
final int OPEN_DEVICE_FAILURE = -2;
final int NOT_FOUND_USBINTERFACE = -3;
final int NO_PERMISSION = -4;
void success();
void error(int code);
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_USB_PERMISSION)) {
boolean granted = intent.getExtras().getBoolean(UsbManager.EXTRA_PERMISSION_GRANTED);
if (granted)
getConnection();
else
mOnUSBInitListener.error(OnUSBInitListener.NO_PERMISSION);
context.unregisterReceiver(receiver);
}
}
};
}
5、使用方法
1.初始化
USBConnectionManager manager=new USBConnectionManager(getApplicationContext(), 1234, 5678, new OnUSBInitListener() {
@Override
public void success() {
}
@Override
public void error(int code) {
}
});
初始化参数中需要传context和usb设备的vid和pid,注意这里是10进制的,如果不知道硬件id的,可以吧硬件插入电脑上,在设备管理器里查看。
2.读写数据
写数据直接调用manager.write(byre[] data)方法,参数为要写的数据,返回值为写入数据长度代表写入成功,为负数则失败。
读数据调用manager.read(byte[] data)方法,参数代表要接受的数据,返回值代表读取的数据长度。
3.关闭
manager.close();