📚 开源资源分享——颜佐光的个人书架
✉️ 联系站长
书架 / Android / usb

Android USB设备通信--插拔监测

2020-09-15 17:26 · 约 2,710 字 · 浏览 3,235 次usb

Android USB设备通信--插拔监测

电子秤和读卡器都可以通过usb口和pos通信。

设备插拔,系统广播

插入或者拔出usb设备时,Android系统都会发出广播,我们可以通过广播监听者BrocastReceiver监听相应的广播,进行相应的初始化或者资源释放。共有三种广播:

  • 设备插入广播
  • 设备授权广播
  • 设备播出广播
public class UsbDeviceHelper extends BroadcastReceiver {
    //android标准的广播action
    private static final String ACTION_USB_DEVICE_PERMISSION = "com.android.example.USB_PERMISSION";
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent == null) return;
        String action = intent.getAction();
        if (TextUtils.isEmpty(action)) return;
        if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)){
            //设备插入,获取这个插入的UsbDevice
            usbDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
            //向用户获取连接USB设备的授权
            requestUserPermission();
        }else if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)){
            //设备拔下,资源释放
        }else if (action.equals(ACTION_USB_DEVICE_PERMISSION)){
            //获取连接设备的权限
            boolean isGranted = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED,false);
            if (isGranted){
                //用户已授权
            }else {
                //用户未授权
            }
        }
    }

    /**
     * 检测到设备插入之后,向用户请求连接设备的权限
     */
    private void requestUserPermission(UsbDevice usbDevice) {
        if (usbManager.hasPermission(usbDevice)){
            //已经有权限的话,直接初始化驱动
            //判断已经授予权限
            return;
        }
        //发一个延时广播
        PendingIntent mPendingIntent = PendingIntent.getBroadcast(
            context, 0,new Intent(ACTION_USB_DEVICE_PERMISSION), 0);
        //这一句会由系统弹出对话框,向用户获取连接授权
        usbManager.requestPermission(usbDevice, mPendingIntent);
    }

    /**
     * 注册USB设备插拔事件监听
     */
    public void registerUsbEventReceiver(Context context){
        this.context = context.getApplicationContext();
        usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_USB_DEVICE_PERMISSION);
        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        this.context.registerReceiver(this, filter);
    }
}

1
整体流程如上面流程图:

  • 设备插入,Android系统检测到后会发出一个广播。android系统检测到设备的插入,可能会花费1秒左右的时间;
  • BrocastReceiver监听到设备插入的广播,向用户获取连接设备的权限,弹出对话框,让用户选择是否连接。这样做是为了系统安全性,防止恶意的USB设备连接Android设备;
  • 用户授权完毕后,也会发出广播,授权结果可以通过Intent对象获取;
  • 用户授权允许连接,进行初始化,连接设备;
  • 用户未授权,不允许连接,提示用户。
  • 设备拔出,Android系统也可以检测到并发出一个广播,BrocastReceiver接收到广播后,进行资源释放,结束。

至于BrocastReceiver,可以在用户登录成功后再进行注册,在应用退出时进行反注册。

← 返回《Android》目录书架 →