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)}
}

在这里插入图片描述
整体流程如上面流程图:

  • 设备插入,Android系统检测到后会发出一个广播。android系统检测到设备的插入,可能会花费1秒左右的时间;

  • BrocastReceiver监听到设备插入的广播,向用户获取连接设备的权限,弹出对话框,让用户选择是否连接。这样做是为了系统安全性,防止恶意的USB设备连接Android设备;

  • 用户授权完毕后,也会发出广播,授权结果可以通过Intent对象获取;

  • 用户授权允许连接,进行初始化,连接设备;

  • 用户未授权,不允许连接,提示用户。

  • 设备拔出,Android系统也可以检测到并发出一个广播,BrocastReceiver接收到广播后,进行资源释放,结束。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值