天天看点

[RK3399][Android7.1] USB设备权限申请控制流程小结App增加权限权限调用流程参考

文章目录

  • App增加权限
  • 权限调用流程
  • 参考

Platform: RK3399

OS: Android 7.1

Kernel: v4.4.83

App增加权限

AndroidManifest.xml填写要求:

[RK3399][Android7.1] USB设备权限申请控制流程小结App增加权限权限调用流程参考

例子:

[RK3399][Android7.1] USB设备权限申请控制流程小结App增加权限权限调用流程参考

也就是说:

  1. 声明

    <uses-feature>

    android.hardware.usb.host

  2. 如果你的APP想要在有USB device插入时能够被调用起来,那么必须要在xml的Activity中申请权限

    android.hardware.usb.action.USB_DEVICE_ATTACHED

  3. 如果只关心某些设备,可以通过

    <meta-data>

    里配置一个xml文件来做过滤

权限调用流程

权限的控制分三块:

  1. USB host端有个线程循环检测系统是否USB设备插拔,如果有就找到申请权限的APP并调用起来
  2. APP运行后主动申请权限,也就是requestPermission()接口
  3. 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权限弹窗

继续阅读