文章目錄
- App增權重限
- 權限調用流程
- 參考
Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83
App增權重限
AndroidManifest.xml填寫要求:

例子:
也就是說:
- 聲明
為<uses-feature>
android.hardware.usb.host
- 如果你的APP想要在有USB device插入時能夠被調用起來,那麼必須要在xml的Activity中申請權限
android.hardware.usb.action.USB_DEVICE_ATTACHED
- 如果隻關心某些裝置,可以通過
裡配置一個xml檔案來做過濾<meta-data>
權限調用流程
權限的控制分三塊:
- USB host端有個線程循環檢測系統是否USB裝置插拔,如果有就找到申請權限的APP并調用起來
- APP運作後主動申請權限,也就是requestPermission()接口
- APP運作後直接打開USB裝置,這時候USB host端會去檢測APP是否已經有控制權限了,也就是調用的hasPermission()接口
針對上面情況,就有三個不同的調用流程,流程主要以彈出權限确認對話框為線索:
- USB host主動調用:
systemReady -> UsbHostManager.java
monitorUsbHostBus ->
android_server_UsbHostManager_monitorUsbHostBus -> android_server_UsbHostManager.java
usb_host_run -> Usbhost.c
usb_host_read_event ->
context->cb_added -> //有usb裝置添加
usb_device_added ->
env->CallVoidMethod -> //對方方法method_endUsbDeviceAdded --> endUsbDeviceAdded
endUsbDeviceAdded -> UsbHostManager.java
getCurrentSettings().deviceAttached ->
deviceAttached -> UsbSettingsManager.java
resolveActivity ->
resolveActivity ->
mUserContext.startActivityAsUser //包名是com.android.systemui.usb.UsbConfirmActivity
onCreate -> UsbConfirmActivity.java
setupAlert //彈出權限确認對話框
- APP申請權限
requestPermission -> UsbManager.java
mService.requestDevicePermission ->
requestDevicePermission -> UsbService.java
getSettingsForUser(userId).requestPermission ->
requestPermission -> UsbSettingsManager.java
requestPermissionDialog ->
mUserContext.startActivityAsUser //包名com.android.systemui.usb.UsbPermissionActivity
onCreate -> UsbPermissionActivity.java
setupAlert //彈出權限确認對話框
- APP打開後USB host檢查權限:
openDevice -> UsbService.java
mHostManager.openDevice ->
openDevice -> UsbHostManager.java
getCurrentSettings().checkPermission ->
hasPermission UsbSettingsManager.java
可以看到,後面兩者都調用到了hasPermission()接口,如果定制系統不想彈出USB權限對話框,那麼可以在這個函數中做修改。
參考
[Google]USB host overview
android usb解析(二)UsbHostManager
Android7.1去掉USB權限彈窗