android 上usb通信

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值