Android дважды запрашивает разрешение на доступ к USB - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть приложение, предназначенное для работы с последовательным 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
...

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

может быть, вам нужно решение, аналогичное используемому в методе onResume в недавно обновленном примере приложения usb-serial-for- android, где я использую флаг для предотвращения повторных диалогов

0 голосов
/ 27 февраля 2020

Поместите разрешение на запрос в onCreate () (после запуска приложения). Также проверьте настройки приложения -> разрешение после того, как вы разрешите его.

...