碰到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设备了, 让我们一起愉快的开发吧!