Android USB Permissions

Posted by admin at 10:19 AM on Apr 6, 2018


Suppose we’re writing a device driver for a USB device, implemented as an Android Service. Our driver checks to see if it has permission to access the device. If it doesn’t, it calls UsbManager.requestPermission, and a window like this pops up:

We click “Use by default for this USB device” and press “OK”.  

Here’s what Android did in response:

  1. Android gave our app temporary permission to access the USB device by updating UsbUserSettingsManager.mDevicePermissionMap.
  2. Android saved our app’s package name and the USB device’s information in the file “/data/system/users/0/usb_device_manager.xml”.

Now, if we reboot the Android device, we would expect Android to repopulate UsbUserSettingsManager.mDevicePermissionMap by reading the “usb_device_manager.xml” file for each user. But does it do this? No. Here’s what really happens.

During boot up, Android repopulates UsbUserSettingsManager.mDevicePermissionMap as a side-effect of sending USB_DEVICE_ATTACHED events to registered Activities. Our driver isn’t an Activity, so it is not granted permission to access the USB device.

To fix this, our driver must create a dummy Activity and register it to receive the USB_DEVICE_ATTACHED event by following the instructions found here.

We have now created a Activity that listens for USB_DEVICE_ATTACHED, so when we reboot Android our driver should automatically be granted permission to access the USB device, right?  No, not if you’re running Android 7 or above. Android 7 has a new boot stage called “Direct Boot” that happens before the user unlocks the device. The USB_DEVICE_ATTACHED event is sent during Direct Boot, and since our app is not “Direct Boot aware” it doesn’t get the USB_DEVICE_ATTACHED message and it doesn’t receive permission to access the USB device.

To work around this Android bug, we need to add


to our dummy Activity’s manifest.

If you would like to provide additional information on the android bug, or see the latest status, please see the following ticket:

Loading Conversation