天天看點

[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權限彈窗

繼續閱讀