文章目录
- 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权限弹窗