我有一些看起来像
的代码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
交互的第三方库。
答案 0 :(得分:0)
返回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上面临同样的问题)