1. 程式人生 > >安卓USB通訊之許可權管理

安卓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插入的時候能監聽到,拔出時沒有作用。