安卓USB通信之权限管理

这篇博客是针对之前的一篇文章Android开发之USB数据通信作的补充。主要是在开发中发现了另外两个不得不面对的问题:

  1. USB访问权限处理。
  2. USB设备插拔状态监听。

—USB访问权限处理——-
当我们安卓手机第一次安装我们USB相关功能的APK时,正常情况下,手机会弹出个类似于“XX应用访问USB设备…”的提示框,如果用户不接受的话,那肯定是不能进行USB通信的。
要怎么才能让手机在安装应用时弹出对应地提示框呢?答案就是在我们的项目中添加相应的权限访问的代码。

1,在Activity的OnCreate()方法中注册广播:

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

2,广播处理:

private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {

        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (ACTION_USB_PERMISSION.equals(action)) {
                synchronized (this) {
                    UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        if (device != null) {
                        }
                    } else {
                        showTmsg("用户不允许USB访问设备,程序退出!");
                        finish();
                    }
                }
            }
        }
    };

3,我们在查找到USB设备时,也应该判断下设备权限,如果没有权限,则请求权限:

 if (!manager.hasPermission(usb)) {//权限判断
                manager.requestPermission(usb, mPermissionIntent);
            }
 //注:usb是指UsbDevice对象,manager是指UsbManager对象。

—-USB设备插拔状态监听——
如果用户在使用应用的过程中,有意或无意中拔出了USB设备后,程序肯定也是不能进行操作的,当然我们也要做相应地判断。
1,同样是注册广播:

 IntentFilter filter = new IntentFilter();
        filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        registerReceiver(usbStateReceiver, filter);

2,广播代码处理:

  private final BroadcastReceiver usbStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            //USB连接上手机时会发送广播android.hardware.usb.action.USB_STATE"及UsbManager.ACTION_USB_DEVICE_ATTACHED
            if (action.equals(ACTION) | action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {//判断其中一个就可以了
                showTmsg("USB已经连接!");
            } else if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {//USB被拔出
                showTmsg("USB连接断开,程序退出!");
                finish();
            }
        }
    };

    //注1:UsbManager.ACTION_USB_DEVICE_ATTACHED对应的广播在USB每次插入时都能监听到,所以用这个就可以监听USB插入。
    //注2:UsbManager.ACTION_USB_DEVICE_DETACHED用来监听USB拔出广播。
    //注3:网上有不少资料是说通过android.hardware.usb.action.USB_STATE对应的广播来监听USB插拔,我在开发中发现该ACTION只在USB插入的时候能监听到,拔出时没有作用。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值