来自UsbManager的NullPointerException

时间:2015-03-13 02:10:13

标签: android android-emulator usb

我有一些看起来像

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

当我使用Android 5.0模拟器时,我遇到了这个崩溃:

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)
    ...

我知道官方的Android模拟器没有USB支持,但我希望看到一个空的USB设备列表,而不是崩溃。

我在Android代码中达到了顶峰,ServiceManager的服务地图没有"usb"的条目。 Android 21堆栈中的任何内容似乎都不会处理ServiceManager返回的空值。

该代码在模拟4.4设备上运行良好,但在5.0设备上崩溃。 CPU架构似乎没有什么区别;我试过ARM和x86。

它在我尝试的所有Genymotion设备上也能正常工作,但我需要在CentOS CI主机上运行,​​并且让Genymotion在CentOS上运行似乎需要进行侵入式更改。

修复或解决方法的任何想法?作为最后的手段,我可​​以捕获UsbManager的NPE,但是它会非常糟糕,因为我还使用了与UsbManager交互的第三方库。

1 个答案:

答案 0 :(得分:0)

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

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

根据API,实现没有义务返回非null值。

解决方法:简单。

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

// Normal route
usbManager.getDeviceList();

(我也在你所描述的Emulator上面临同样的问题)