2015-11-07 31 views
10

Come afferma il titolo, sto riscontrando dei problemi nell'enumerazione di un dispositivo USB specifico su un telefono Android USB compatibile con UsbManager.getDeviceList(). Non ho avuto problemi a elencare e comunicare con altri dispositivi USB su questo e altri telefoni, ma questo specifico dispositivo USB non può essere trovato. Inoltre, non può essere elencato con app di terze parti come USB Device Info.Perché questo dispositivo specifico non può essere enumerato da UsbManager.getDevicesList()?

Di seguito sono elencate correttamente le proprietà USB su un PC. Ho comunicato con il produttore del dispositivo che ha confermato che una società esterna ha certificato il dispositivo seguendo le specifiche USB 2.0. Originariamente, il mio sospetto era che il dispositivo fosse stato rifiutato da Android perché ometteva i seguenti campi: iManufacturer, iProduct e iSerialNumber, che erano inclusi da altri dispositivi compatibili. Tuttavia, sembra che questi campi non sono necessari dopo aver esaminato questo estratto dalla sezione 9.5 del USB 2.0 Spec:

Se del caso, i descrittori contengono riferimenti a descrittori di stringa che forniscono informazioni visualizzabili che descrivono un descrittore in forma leggibile. L'inclusione di descrittori di stringhe è facoltativa. Tuttavia, i campi di riferimento all'interno dei descrittori sono obbligatori. Se un dispositivo non supporta i descrittori di stringhe, i campi di riferimento stringa devono essere ripristinati a zero per indicare che non è disponibile alcun descrittore di stringhe.

La mia domanda, quindi, è ciò che sta causando l'UsbManager per rifiutare l'enumerazione di questo dispositivo USB? E, cosa più importante, c'è qualcosa che posso fare per forzare Android ad enumerare questo dispositivo? Idealmente, sono più interessato a una soluzione che non richieda l'accesso come root, ma non è necessariamente un deal-breaker.

USB properties


EDIT: Alcuni codice di esempio.

UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList(); 
// When I plug in this USB device, deviceList is empty. 
// Other devices are discoverable, however. 

EDIT 2: ho provato con alcuni altri telefoni. Ho enumerato con successo il dispositivo USB con i seguenti telefoni:

  • Nota 2
  • LG-V400

I seguenti dispositivi non possono enumerare la periferica:

  • Nexus 5
  • Galaxy S4, S5, S6
  • LG G2, 4G LTE

EDIT 3: Here are the logs di chiamare adb shell dmesg su un Nexus 5 dopo aver collegato il dispositivo USB. È possibile vedere chiaramente sulle righe 4-16 che il telefono non riesce a enumerare il dispositivo.

+0

Invia qualche codice per favore? – napkinsterror

+0

Proprio fatto. È un caso molto semplice, quindi non sono sicuro di quanto sia utile. –

+0

Puoi stampare i risultati? Hai aggiunto le autorizzazioni appropriate? – napkinsterror

risposta

2

Dopo aver collegato il dispositivo USB al telefono Android, disconnetterlo e collegare il telefono al computer in modo da poter utilizzare adb shell dmesg per controllare il registro del kernel. Se viene visualizzato il dispositivo nel registro del kernel, il telefono lo riconosce e non sono sicuro del motivo per cui non viene restituito da UsbManager. Quello che sospetto è che non verrà visualizzato nel registro del kernel o ci sarà un errore lì.Questo probabilmente significa che il dispositivo non è compatibile con il controller OTG del telefono o che non riceve abbastanza energia per funzionare correttamente.

+0

Grande suggerimento sull'uso di 'adb shell dmesg'. [Qui ci sono i log.] (Https://gist.github.com/MikeOrtiz/92fc07d4761ce6e0b4d3) Sulle righe 4-16, mostra l'enumerazione del dispositivo USB non riuscita. Non penso che il problema sia con il potere. Questo dispositivo disegna 100 mA rispetto a un altro dispositivo USB che posso enumerare con successo e che disegna 500 mA. C'è un modo per capire meglio cosa potrebbe causare il problema? E c'è una soluzione alternativa, anche se è richiesto root? –

+1

A questo punto, il debug del problema richiede anche la creazione di un kernel con più logging (in modo da poter capire quali richieste stanno fallendo e forse più dettagli) o acquistare uno sniffer del protocollo USB per vedere se qualcosa di strano sta accadendo sul filo. –

1

io non avere una soluzione e non possono anche avere un suggerimento utile, ma l'errore sembra essere un po 'spiegabile:

#define EOVERFLOW 75 /* Value too large for defined data type */ 

Spero che questo porta a una spiegazione e, infine, una soluzione.

Kaamel

Problemi correlati