安卓USB通訊之許可權管理
阿新 • • 發佈:2019-01-30
這篇部落格是針對之前的一篇文章Android開發之USB資料通訊作的補充。主要是在開發中發現了另外兩個不得不面對的問題:
- USB訪問許可權處理。
- 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插入的時候能監聽到,拔出時沒有作用。