Come impedire ad Android di richiedere l'autorizzazione prima di consentire l'accesso al dispositivo USB


19

Ho un'applicazione in esecuzione su un tablet Android senza nome rootato con ICS 4.0.3 che controlla un dispositivo USB tramite l'interfaccia della modalità host USB. Il file android.hardware.usb.host.xml è presente in / system / etc / Permissions e tutto funziona a meraviglia. Solo che ...

Quando eseguo l'app per la prima volta dopo un riavvio e quindi collego il dispositivo USB, viene visualizzata una finestra popup che dice "Consenti all'app APPNAME di accedere al dispositivo USB? [] Utilizzalo per impostazione predefinita per questo dispositivo USB. Annulla OK" e Devo toccare OK prima che possa iniziare a utilizzare il dispositivo.

Devo disattivare la conferma dell'utente in modo che l'app possa utilizzare immediatamente il dispositivo. Come faccio a fare questo? Ho alcuni suggerimenti sull'utilizzo di un generatore di tasti per simulare l'utente toccando il pulsante sullo schermo, ma preferirei evitare quel tipo di approccio e impostare le cose in modo che la richiesta di conferma semplicemente non accada.

Probabilmente non riesco a convincere il fornitore a compilare un kernel personalizzato per me, ma dovrei essere in grado di ottenere la chiave di firma del firmware da loro in modo da poter firmare la mia app come app di sistema, se ciò mi aiuterà.

Un problema associato: spuntare la casella "Usa per impostazione predefinita per questo dispositivo USB" non sembra essere d'aiuto - se scollego e ricollego il dispositivo, ricevo di nuovo la richiesta di conferma. Ho notato in questa situazione che il numero del dispositivo in / dev / bus / usb / 001 / cambia ogni volta che scollego e ricollego (001, 002, 003 ecc.) Che forse spiega questo particolare problema.


Cosa succede se si distribuisce l'app in / system / app? Puoi provarlo con e senza la firma del sistema. Lo scrivo come commento perché (a) non l'ho provato e (b) non so se questo modello di distribuzione è disponibile per te.
Rob Pridham,

Risposte:


10

Questa domanda e risposta è sostanzialmente un duplicato di
/programming//a/15151075/588476
Vedi il link sopra per un programma di esempio e una discussione più approfondita.

Per quanto ne so, ci sono due modi per ottenere il popup della casella di autorizzazione USB:

  1. Richiedi l'autorizzazione esplicita dalla tua applicazione utilizzando UsbManager.requestPermission (...)
  2. Registra un filtro intenti sull'accessorio e lascia che il sistema richieda l'autorizzazione quando il dispositivo è collegato

Nel caso di 1 ho scoperto che la casella di controllo sul popup per ricordare l'autorizzazione non ha alcun effetto.

Per me, ho rimosso tutto il codice relativo alle autorizzazioni dal mio software e ho semplicemente inserito il filtro intent nel mio manifest. Quando il dispositivo USB è collegato, se non è già stata concessa l'autorizzazione, verrà visualizzata la finestra di autorizzazione USB. Se l'utente fa clic su OK senza selezionare la casella Ricorda, la finestra verrà nuovamente visualizzata alla successiva connessione del dispositivo. Tuttavia, se l'utente seleziona la casella e preme OK, la casella non dovrebbe mai più essere visualizzata (a meno che il software non venga disinstallato e quindi reinstallato).

Non sono sicuro che ci sia un bug da qualche parte correlato al tuo dispositivo che appare come / dev / bus / usb / 001 e quindi 002 ecc. Fammi sapere se stai usando il filtro intent, come senza la casella Ricorda fare niente.

Non so in alcun modo che puoi evitare del tutto il pop-up dei permessi. Ho il sospetto che non c'è modo di farlo senza scavare nel codice Android come hai detto.


1
Sei sicuro? Ricevo ancora la richiesta di autorizzazione quando il dispositivo è scollegato e ricollegato. Questo comportamento è coerente con la documentazione in developer.android.com/guide/topics/connectivity/usb/host.html . La sezione "Utilizzo di un filtro intento" dice "Se gli utenti accettano, l'applicazione ha automaticamente l'autorizzazione ad accedere al dispositivo fino a quando il dispositivo non viene disconnesso"
kbro

Posso solo garantire il Nexus 7, Galaxy S3 e Galaxy Note, su quei dispositivi che devo accettare l'autorizzazione solo una volta (il dispositivo Android funziona in modalità host) - a condizione che abilito la casella di controllo per ricordare la decisione. Quale dispositivo / versione di Android stai usando, ho la sensazione che sia un dispositivo personalizzato / OEM?
Wayne Uroda l'

È un tablet OEM da 7 pollici basato su WonderMedia WM8850-mid SOM con Android 4.0.3.
Kbro

I filtri di intenti funzionano solo per la sessione di avvio corrente. Sì, collego un dispositivo USB al mio telefono e concede l'autorizzazione automaticamente
user924

7

Oltre al mio commento, ho dato un'occhiata al codice Android sottostante.

Ho una possibile risposta, ma con non meno di quattro avvertimenti e ostacoli principali:

  1. Non l'ho provato, perché non ho dispositivi USB adatti a portata di mano.
  2. Hai bisogno di una nuova autorizzazione
  3. L'autorizzazione richiede che tu sia un'app di sistema
  4. Il codice richiede l'accesso a qualcosa che non è nell'API pubblica

Dimenticalo se distribuisci normali applicazioni after-market!

Il primo requisito è che tu abbia l' MANAGE_USBautorizzazione. Questo è descritto qui .

Tuttavia a loro volta i prerequisiti per questo sono che si firma con la chiave di sistema e si installa l'app in / system / app.

Ad ogni modo, se stai bene, ecco un po 'di codice:

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

mDevice è il dispositivo di prima.

uidè l'UID della tua app e puoi cercarlo. Un esempio di come farlo è la prima risposta qui .

Tutto bene? No. ServiceManagerè android.os.ServiceManagere quindi non è un'API pubblica. Questo, in questo esempio, è il tuo modo di mettere le mani sul IUsbManagerservizio (potrebbero esserci altri percorsi). Ora, aggirare ciò va oltre lo scopo della mia risposta; ai vecchi tempi si poteva usare la riflessione, ma non so se è ancora possibile.

Dopo tutti quegli shenanigans, sembra che non sia più necessario richiedere l'autorizzazione e, in tal caso, tornerà immediatamente senza dialoghi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.