android 关于usb开发和一些注意事项

碰到usb开发,遇到一些问题总结一下

usb的权限用到的广播注册,应放在首位

mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
//注册USB设备权限管理广播
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(receiver, filter);

接下来肯定需要获取usb设备列表或者通过名称获取该设备

HashMap<String, UsbDevice> devices = usbManager.getDeviceList();
Iterator<UsbDevice> deviceIterator = devices.values().iterator();
int count = devices.size();
if (count > 0) {
    while (deviceIterator.hasNext()) {
        UsbDevice device = deviceIterator.next();
        String deviceName = device.getDeviceName();
        if (mPrintModel.checkUsbDevicePidVid(device)) {
            //获取第一个usb设备请求连接或者请求权限后再广播接收里面连接usb设备
            initConnectUsb(usbManager, deviceName, mPermissionIntent);
            return;
        }
    }
} else {
    String notDevice = "没有发现设备";
    mIView.getPrintState().setText(notDevice);
}
private void initConnectUsb(UsbManager usbManager, String usbName, PendingIntent mPermissionIntent) {
    UsbDevice usbDevice = usbManager.getDeviceList().get(usbName);
    //判断USB设备是否有权限
    if (usbManager.hasPermission(usbDevice)) {
        mIView.getPrintState().setText("正在连接...");
        mPrintModel.usbConn(usbDevice, mIView.getPrintState());
    } else {
        ToastUtils.showToast(mContext, "正在请求权限");
        mIView.getPrintState().setText("正在请求权限...");
        usbManager.requestPermission(usbDevice, mPermissionIntent);
//如果想法好的,把连接usb放在这里,但现实很残酷,并不能解决问题
    }
}

但是这样写当我们没有权限的时候虽然有设备列表但不会建立连接,而是去请求权限。这个时候我们最开始注册的广播就有用武之地了,但请求权限时,广播就会发出一条信息,走如下方法

BroadcastReceiver receiver = 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) {
                            homePrintStata.setText("连接中...");
//                            ToastUtils.showToast(mContext, "打印设备正在连接...");
                            //在此处连接usb设备,当我们申请权限后确认是usb而且驱动不为空,则执行连接操作
                            mPresenter.connectUsbDevice(device, homePrintStata);
                        }
                    } else {
                        Toast.makeText(mContext, "permission denied for device " + device.getDeviceName(), Toast.LENGTH_SHORT).show();
                    }
                }


            }
        }
    }; 

这样一来我们就可以顺利连接usb设备了, 让我们一起愉快的开发吧!

猜你喜欢

转载自blog.csdn.net/TheBest_XueTu/article/details/83035636
今日推荐