2015-03-13 21 views
8

Ho qualche codice che assomigliaNullPointerException da UsbManager

UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); 
usbManager.getDeviceList(); 

Quando uso un Android 5.0 emulatore, ottengo questo incidente:

java.lang.NullPointerException: Attempt to invoke interface method 'void android.hardware.usb.IUsbManager.getDeviceList(android.os.Bundle)' on a null object reference 
    at android.hardware.usb.UsbManager.getDeviceList(UsbManager.java:243) 
    ... 

Capisco che l'emulatore ufficiale di Android non ha USB supporto, ma mi aspetto di vedere una lista vuota di dispositivi USB piuttosto che un crash.

I peaked nel codice Android un po ', e la mappa dei servizi ServiceManager non aveva una voce per "usb". Nulla nello stack di Android 21 sembra gestire il valore nullo restituito da ServiceManager.

Il codice funziona correttamente su dispositivi emulati 4.4, ma si blocca su dispositivi 5.0. L'architettura della CPU non sembra fare la differenza; Ho provato ARM e x86.

Funziona bene anche su tutti i dispositivi Genymotion che ho provato, ma ho bisogno di farlo funzionare su host CentOS CI, e far funzionare Genymotion su CentOS sembra richiedere modifiche invadenti.

Qualche idea per una correzione o una soluzione alternativa? Come ultima risorsa potrei prendere l'NPE di UsbManager, ma sarebbe piuttosto brutto in quanto uso anche una libreria di terze parti che interagisce con UsbManager.

+1

questo: https://bugs.chromium.org/p/chromium/issues/detail?id=578875 suggerisce che - getDevicesList non funziona sugli emulatori a causa della mancanza di supporto per gli emulatori. – Tom

risposta

0

https://developer.android.com/reference/android/content/Context.html#getSystemService(java.lang.String)

RETURN Object The service or null if the name does not exist.

Secondo API attuazione non è obbligata a restituito un valore non null.

Work around: semplice.

UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); 
if (usbManager == null) { 
    Log.w("MyApp","USB Not supported"); 
    return; 
} 

// Normal route 
usbManager.getDeviceList(); 

(ho anche affrontato lo stesso problema su emulatore come hai descritto)

+0

L'OP chiede un'eccezione in getDeviceList, non un valore restituito da getSystemService. – Tom