Jak zatrzymać system Android z prośbą o pozwolenie przed zezwoleniem na dostęp do urządzenia USB

19

Mam aplikację działającą na zrootowanym tablecie z Androidem bez nazwy z systemem ICS 4.0.3, który steruje urządzeniem USB za pośrednictwem interfejsu trybu hosta USB. Plik android.hardware.usb.host.xml jest obecny w / system / etc / permissions i wszystko działa wspaniale. Z wyjątkiem...

Gdy uruchamiam aplikację po raz pierwszy po ponownym uruchomieniu, a następnie podłączam urządzenie USB, pojawia się wyskakujące okienko z komunikatem „Zezwolić aplikacji APPNAME na dostęp do urządzenia USB? [] Używać domyślnie dla tego urządzenia USB. Anulować OK” i Muszę nacisnąć OK, zanim będzie można rozpocząć korzystanie z urządzenia.

Muszę wyłączyć potwierdzenie użytkownika, aby aplikacja mogła od razu korzystać z urządzenia. Jak mam to zrobic? Wydaje mi się kilka sugestii dotyczących używania generatora naciśnięć klawiszy do symulacji użytkownika dotykającego przycisku na ekranie, ale wolałbym unikać tego rodzaju podejścia i konfigurować takie ustawienia, aby żądanie potwierdzenia po prostu nie nastąpiło.

Prawdopodobnie nie mogę zmusić dostawcy do wykonania dla mnie niestandardowej kompilacji jądra, ale powinienem móc uzyskać od nich klucz do podpisywania oprogramowania układowego, aby mógł podpisać moją aplikację jako aplikację systemową, jeśli to pomoże.

Jeden związany z tym problem: zaznaczenie pola „Domyślnie używaj dla tego urządzenia USB” nie wydaje się pomocne - jeśli odłączę i ponownie podłączę urządzenie, ponownie otrzymam monit o potwierdzenie. Zauważyłem w tej sytuacji, że numer urządzenia w / dev / bus / usb / 001 / zmienia się za każdym razem, gdy odłączam i ponownie uruchamiam (001, 002, 003 itd.), Co być może wyjaśnia ten konkretny problem.

kbro
źródło
Co się stanie, jeśli wdrożysz aplikację w / system / app? Możesz spróbować z podpisaniem systemu i bez niego. Piszę to jako komentarz, ponieważ (a) nie próbowałem tego, i (b) nie wiem, czy ten model wdrażania jest dostępny.
Rob Pridham,

Odpowiedzi:

10

To pytanie i odpowiedź jest w zasadzie duplikatem
/programming//a/15151075/588476
Zobacz powyższy link, aby zobaczyć przykładowy program i bardziej szczegółową dyskusję.

O ile mi wiadomo, istnieją dwa sposoby uzyskania wyskakującego okienka zezwolenia USB:

  1. Zażądaj wyraźnego pozwolenia z aplikacji za pomocą UsbManager.requestPermission (...)
  2. Zarejestruj filtr celowy na akcesorium i pozwól systemowi poprosić o pozwolenie, gdy urządzenie zostanie podłączone

W przypadku 1 stwierdziłem, że pole wyboru w wyskakującym okienku do zapamiętania pozwolenia nie ma wpływu.

Dla mnie usunąłem cały kod związany z uprawnieniami z mojego oprogramowania i po prostu umieściłem filtr zamiaru w moim manifeście. Gdy urządzenie USB jest podłączone, jeśli nie zostało mu jeszcze przyznane pozwolenie, pojawi się okno zezwolenia USB. Jeśli użytkownik kliknie przycisk OK bez zaznaczenia pola zapamiętywania, okno pojawi się ponownie przy następnym podłączeniu urządzenia. Jeśli jednak użytkownik zaznaczy pole i naciśnie przycisk OK, okno nigdy nie powinno się ponownie wyświetlać (chyba że oprogramowanie zostanie odinstalowane, a następnie ponownie zainstalowane).

Nie jestem pewien, czy istnieje jakiś błąd związany z twoim urządzeniem, który pojawia się jako / dev / bus / usb / 001, a następnie 002 itd. - daj mi znać, jeśli używasz filtru zamiarów, ponieważ bez tego pola wyboru zapamiętaj nic nie robić.

Nie znam żadnego sposobu na całkowite uniknięcie wyskakującego okienka zezwolenia. Podejrzewam, że nie ma sposobu, aby to zrobić bez zagłębiania się w kod Androida, jak powiedziałeś.

Wayne Uroda
źródło
1
Jesteś pewny? Nadal widzę prośbę o pozwolenie, gdy urządzenie jest odłączone i ponownie podłączone. To zachowanie jest zgodne z dokumentacją w developer.android.com/guide/topics/connectivity/usb/host.html . Sekcja „Korzystanie z filtru zamiarów” mówi „Jeśli użytkownicy zaakceptują, Twoja aplikacja automatycznie będzie miała dostęp do urządzenia, dopóki urządzenie nie zostanie odłączone”
kbro
Mogę tylko ręczyć za Nexusa 7, Galaxy S3 i Galaxy Note, na tych urządzeniach muszę tylko raz zaakceptować pozwolenie (urządzenie z Androidem działa w trybie hosta) - pod warunkiem, że zaznaczę pole wyboru, aby zapamiętać decyzję. Z jakiego urządzenia / wersji Androida korzystasz, mam wrażenie, że jest to urządzenie niestandardowe / OEM?
Wayne Uroda
To 7-calowy tablet OEM oparty na WonderMedia WM8850-mid SOM z systemem Android 4.0.3.
kbro
Filtry zamiaru działają tylko dla bieżącej sesji rozruchowej. Tak, podłączam urządzenie USB do mojego telefonu i automatycznie przyznaje ono uprawnienia
user924
7

Po moim komentarzu zajrzałem do kodu Androida.

Mam możliwą odpowiedź, ale z nie mniej niż czterema głównymi zastrzeżeniami i przeszkodami:

  1. Nie próbowałem tego, ponieważ nie mam pod ręką żadnych odpowiednich urządzeń USB.
  2. Potrzebujesz nowego pozwolenia
  3. Uprawnienie wymaga, abyś był aplikacją systemową
  4. Kod wymaga dostępu do czegoś, co nie znajduje się w publicznym interfejsie API

Zapomnij o tym, jeśli wdrażasz zwykłe aplikacje z rynku wtórnego!

Pierwszym warunkiem jest posiadanie MANAGE_USBpozwolenia. To jest opisane tutaj .

Jednak z kolei warunkiem jest podpisanie się przy użyciu klucza systemowego i zainstalowanie aplikacji w / system / app.

W każdym razie, jeśli nie masz nic przeciwko, oto kod:

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

mDevice to urządzenie z przeszłości.

uidjest identyfikatorem UID Twojej aplikacji i możesz to sprawdzić. Przykładem tego jest pierwsza odpowiedź tutaj .

Wszystko dobrze? Nie. ServiceManagerTo android.os.ServiceManagernie jest publiczny interfejs API. W tym przykładzie jest to sposób na uzyskanie dostępu do IUsbManagerusługi (mogą istnieć inne trasy). Teraz obejście tego jest poza zakresem mojej odpowiedzi; w dawnych czasach można było używać refleksji, ale nie wiem, czy nadal możesz.

Po tych wszystkich shenaniganach wygląda na to, że nie musisz już prosić o pozwolenie, a jeśli to zrobisz, natychmiast wróci bez dialogu.

Rob Pridham
źródło