Як зупинити прохання Android про дозвіл, перш ніж дозволити доступ до USB-пристрою


19

У мене є програма, що працює на вкоріненому планшеті Android Android, який працює під керуванням ICS 4.0.3, який керує USB-пристроєм через інтерфейс USB-хоста. Файл android.hardware.usb.host.xml присутній у дозволах / system / etc /, і все працює чудово. За винятком ...

Коли я запускаю програму вперше після перезавантаження, а потім підключаю USB-пристрій, з'являється спливаюче вікно із написом "Дозволити додатку APPNAME отримати доступ до USB-пристрою? [] Використовувати за замовчуванням для цього пристрою USB. Скасувати ОК" і Мені потрібно натиснути OK, перш ніж він може почати використовувати пристрій.

Мені потрібно вимкнути підтвердження користувача, щоб програма могла використовувати пристрій відразу. Як це зробити? Мені здається, деякі поради щодо використання генератора натискань клавіш для імітації користувачем натискання кнопки на екрані, але я вважаю за краще уникати такого підходу і налаштовувати речі так, щоб запит на підтвердження просто не відбувся.

Напевно, я не можу змусити постачальника зробити власну ядерну побудову для мене, але я маю змогу отримати від них ключ підпису програмного забезпечення, щоб я могла підписати свій додаток як системний додаток, якщо це допоможе.

Одна пов’язана проблема: позначення поля "Використовувати за замовчуванням для цього пристрою USB" не допомагає - якщо я відключу підключення та повторно підключую пристрій, то я знову отримуватимуть запит на підтвердження. Я помітив у цій ситуації, що номер пристрою в / dev / bus / usb / 001 / змінюється кожного разу, коли я відключаю штепсельну вилку та вимикаю модуль живлення (001, 002, 003 тощо), що, можливо, пояснює цю проблему.


Що станеться, якщо розгорнути додаток у / system / app? Ви можете спробувати це з і без підписання системи. Я пишу це як коментар, оскільки (a) я не пробував цього, і (b) я не знаю, чи доступна вам ця модель розгортання.
Роб Придхам

Відповіді:


10

Це питання та відповідь, в основному, є дублікатом
/programming//a/15151075/588476
Див. Вищенаведене посилання для прикладу програми та більш глибокого обговорення.

Наскільки мені відомо, є два способи отримати спливаюче вікно USB-дозволу:

  1. Запросіть дозвіл явно у вашої програми за допомогою UsbManager.requestPermission (...)
  2. Зареєструйте фільтр намірів на своєму аксесуарі і дозвольте системі запитати дозволу, коли пристрій підключено

У випадку 1 я виявив, що прапорець на спливаючому вікні, щоб запам'ятати дозвіл, не впливає.

Для мене я видалив увесь код, пов’язаний з дозволами зі свого програмного забезпечення та просто поставив фільтр намірів у свій маніфест. Якщо підключено USB-пристрій, якщо він ще не отримав дозвіл, тоді з'явиться вікно дозволу USB. Якщо користувач натисне кнопку "ОК", не встановивши прапорець пам'яті, це поле знову з’явиться під час наступного підключення пристрою. Однак якщо користувач перевіряє прапорець і натискає кнопку "ОК", це поле більше ніколи не відображатиметься (якщо тільки програмне забезпечення не буде встановлено та не перевстановлено).

Я не впевнений, чи є десь помилка, пов’язана з вашим пристроєм, яка відображається як / dev / bus / usb / 001, а потім 002 і т. Д. - дайте мені знати, якщо ви використовуєте фільтр намірів, так як без цього прапорець пам'ятати буде нічого не робити.

Я не знаю жодного способу, що можна взагалі уникнути спливаючого дозволу. Я підозрюю, що немає способу це зробити, не занурившись в код Android, як ви сказали.


1
Ти впевнений? Я все ще бачу запит на дозвіл, коли пристрій відключено та підключено до мережі. Така поведінка відповідає документації в developer.android.com/guide/topics/connectivity/usb/host.html . У розділі «Використання фільтра намірів» йдеться про «Якщо користувачі приймають, ваша програма автоматично має дозвіл на доступ до пристрою до відключення пристрою»
kbro

Я можу поручитися на Nexus 7, Galaxy S3 та Galaxy Note, на цих пристроях я повинен прийняти дозвіл лише один раз (пристрій Android працює в хост-режимі) - за умови, що я дозволяю прапорець запам'ятати рішення. Який пристрій / версію Android ви використовуєте, я відчуваю, що це пристрій на замовлення / OEM?
Уейн Урода

Це 7-дюймовий планшетний ПК на базі WonderMedia WM8850-SOM, який працює на Android 4.0.3.
кбро

Фільтри намірів працюють лише для поточного сеансу завантаження. Так, я підключаю USB-пристрій до свого телефону, і він автоматично надає дозвіл
user924

7

На додаток до коментаря я ознайомився з основним кодом Android.

У мене є відповідь, але з не менше чотирма основними застереженнями та перешкодами:

  1. Я не пробував цього, тому що у мене немає підходящих USB-пристроїв.
  2. Вам потрібен новий дозвіл
  3. Дозвіл вимагає, щоб ви були системним додатком
  4. Код вимагає доступу до чогось, що не є у відкритому API

Забудьте про це, якщо розгорнути звичайні додатки після продажу!

Перша умова - це те, що ви маєте MANAGE_USBдозвіл. Це описано тут .

Однак у свою чергу передумовами цього є те, що ви підписуєтесь за допомогою системного ключа та встановлюєте додаток у / system / app.

У будь-якому випадку, якщо ви з цим все в порядку, ось код:

   IBinder b = ServiceManager.getService(USB_SERVICE);
   IUsbManager service = IUsbManager.Stub.asInterface(b);
   service.grantDevicePermission(mDevice, uid);

mDevice це пристрій від раніше.

uid- це UID вашого власного додатка, і ви можете переглянути це. Приклад того, як це зробити, - перша відповідь тут .

Все добре? Ні, ServiceManagerце, android.os.ServiceManagerтаким чином, не є загальнодоступним API. Це, у цьому прикладі, ваш спосіб отримати свої IUsbManagerпослуги (можуть бути інші маршрути). Тепер, що обходить , що виходить за рамки моєї відповіді; за старих часів ви могли використовувати роздуми, але я не знаю, чи все ще можете.

Зрештою, ці шенагігани виглядають, що вам більше не потрібно просити дозволу, і якщо це зробити, він повернеться негайно без діалогу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.