У меня есть приложение, предназначенное для работы с последовательным USB-устройством. Манифест содержит соответствующий фильтр:
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
Когда я подключаю устройство USB, всплывающее диалоговое окно системы спрашивает: « Открыть ... при подключении этого устройства USB?». Я могу подтвердить или отклонить, и эта часть работает нормально. Однако, если я отклоняю и затем перезагружаю приложение из меню, мой телефон зависает. В трассировке стека я вижу ошибку:
User has not given permission to device UsbDevice...
Поэтому я должен явно запросить разрешение USB. Я пробовал несколько реализаций, и самая простая из них выглядит следующим образом (я использую библиотеку usb_serial_for_ android: https://github.com/mik3y/usb-serial-for-android):
@Override
protected void onResume() {
....
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
...
List<UsbSerialDriver> availableDrivers = CustomProber.getCustomProber().findAllDrivers(manager);
...
UsbSerialDriver driver = availableDrivers.get(0);
if (!manager.hasPermission(driver.getDevice())) {
manager.requestPermission(
driver.getDevice(),
PendingIntent.getBroadcast(this, 0, new Intent("com.android.example.USB_PERMISSION"), 0));
return;
}
....
}
Проблема в том, что "manager.requestPermission "выполняется дважды.
Когда я запускаю приложение из меню, всплывающее диалоговое окно спрашивает" Разрешить приложению ... доступ к USB-устройству? " Если я подтверждаю, снова появляется тот же диалог, но мой ответ не имеет значения. Кажется, что разрешение уже предоставлено, как будто я отклоняю второй запрос, приложение продолжает работать и успешно обмениваться данными с устройством. Это довольно раздражающее поведение: (
Что мне не хватает?
PS Я также попробовал «канонический» способ, описанный Android Разработчиками (https://developer.android.com/guide/topics/connectivity/usb/host Однако, эта реализация, основанная на BroadcastReceiver, ведет себя таким же образом. Я прочитал соответствующие посты, например, этот Android дважды запрашивает разрешение USB * и связался с автором. Проблема по-прежнему актуальна.
ОБНОВЛЕНИЕ
Вот журнал:
...
...
I/storage permission: DENIED
V/PhoneWindow: DecorView setVisiblity: visibility = 4, Parent = null, this = DecorView@8856cab[]
D/WindowClient: Add to mViews: DecorView@8856cab[MainActivity], this = android.view.WindowManagerGlobal@5653205
...
Появилось всплывающее окно при доступе к хранилищу. Я нажал «разрешить»
I/storage permission: GRANTED
I/directory: EXISTS
I/usb permission: DENIED
V/PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = ViewRoot{632025a com.ERG.erglogger/com.ERG.erglogger.MainActivity,ident = 0}, this = DecorView@8856cab[MainActivity]
Появилось первое всплывающее окно при доступе через USB. Я нажал «ОК».
I/storage permission: GRANTED
I/directory: EXISTS
I/usb permission: DENIED
V/PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = ViewRoot{632025a com.ERG.erglogger/com.ERG.erglogger.MainActivity,ident = 0}, this = DecorView@8856cab[MainActivity]
Я нажал «ОК», но разрешение не было предоставлено (manager.hasPermission (драйвер. getDevice ()) имеет значение false). Итак, появилось второе всплывающее окно с доступом через USB, и после того, как я нажал «ОК», разрешение было предоставлено:
I/storage permission: GRANTED
I/directory: EXISTS
I/usb permission: GRANTED
D/CdcAcmSerialDriver: trying default interface logic
...