Java 从github下载的FileHelper类的NullPointerException
我正在跟随一个视频指南/教程从Treehouse为Android制作一个自毁信息应用程序。在我从github下载FileHelper类(由视频指南中的家伙编写)之前,一切都很顺利 现在,当我运行应用程序并在通过设备的gallery选择照片/视频后尝试向后端发送消息时,它工作正常,但当我从设备摄像头选择照片/视频时,它崩溃,我在logcat中得到一个nullPointerExceptionJava 从github下载的FileHelper类的NullPointerException,java,android,nullpointerexception,Java,Android,Nullpointerexception,我正在跟随一个视频指南/教程从Treehouse为Android制作一个自毁信息应用程序。在我从github下载FileHelper类(由视频指南中的家伙编写)之前,一切都很顺利 现在,当我运行应用程序并在通过设备的gallery选择照片/视频后尝试向后端发送消息时,它工作正常,但当我从设备摄像头选择照片/视频时,它崩溃,我在logcat中得到一个nullPointerException 04-16 19:35:19.007: E/AndroidRuntime(6299): FATAL EXCE
04-16 19:35:19.007: E/AndroidRuntime(6299): FATAL EXCEPTION: main
04-16 19:35:19.007: E/AndroidRuntime(6299): java.lang.NullPointerException
04-16 19:35:19.007: E/AndroidRuntime(6299): at
com.pbg.swapzy.FileHelper.getByteArrayFromFile(FileHelper.java:27)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
com.pbg.swapzy.RecipientsActivity.createMessage(RecipientsActivity.java:159)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
com.pbg.swapzy.RecipientsActivity.onOptionsItemSelected(RecipientsActivity.java:122)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
android.app.Activity.onMenuItemSelected(Activity.java:2606)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1045)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected
(MenuBuilder.java:735)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:592)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:149)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
android.view.View.performClick(View.java:4222)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
android.view.View$PerformClick.run(View.java:17273)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
android.os.Handler.handleCallback(Handler.java:615)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
android.os.Handler.dispatchMessage(Handler.java:92)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
android.os.Looper.loop(Looper.java:137)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
android.app.ActivityThread.main(ActivityThread.java:4895)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
java.lang.reflect.Method.invokeNative(Native Method)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
java.lang.reflect.Method.invoke(Method.java:511)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
04-16 19:35:19.007: E/AndroidRuntime(6299): at
dalvik.system.NativeStart.main(Native Method)
这是有问题的代码
public static byte[] getByteArrayFromFile(Context context, Uri uri) {
byte[] fileBytes = null;
InputStream inStream = null;
ByteArrayOutputStream outStream = null;
if (uri.getScheme().equals("content")) {
try {
inStream = context.getContentResolver().openInputStream(uri);
outStream = new ByteArrayOutputStream();
byte[] bytesFromFile = new byte[1024*1024]; // buffer size (1 MB)
int bytesRead = inStream.read(bytesFromFile);
while (bytesRead != -1) {
outStream.write(bytesFromFile, 0, bytesRead);
bytesRead = inStream.read(bytesFromFile);
}
fileBytes = outStream.toByteArray();
}
catch (IOException e) {
Log.e(TAG, e.getMessage());
}
finally {
try {
inStream.close();
outStream.close();
}
catch (IOException e) { /*( Intentionally blank */ }
}
}
else {
try {
File file = new File(uri.getPath());
FileInputStream fileInput = new FileInputStream(file);
fileBytes = IOUtils.toByteArray(fileInput);
}
catch (IOException e) {
Log.e(TAG, e.getMessage());
}
}
return fileBytes;
}
第27行是
if (uri.getScheme().equals("content")) {
谢谢你的帮助
此代码中使用了编辑getByteArrayFromFile
protected ParseObject createMessage() {
ParseObject message = new ParseObject(ParseConstants.CLASS_MESSAGES);
message.put(ParseConstants.KEY_SENDER_ID, ParseUser.getCurrentUser().getObjectId());
message.put(ParseConstants.KEY_SENDER_NAME, ParseUser.getCurrentUser().getUsername());
message.put(ParseConstants.KEY_RECIPIENT_IDS, getRecipientIds());
message.put(ParseConstants.KEY_FILE_TYPE, mFileType);
byte[] fileBytes = FileHelper.getByteArrayFromFile(this, mMediaUri);
if (fileBytes == null){
return null;
}
else {
if (mFileType.equals(ParseConstants.TYPE_IMAGE)) {
fileBytes = FileHelper.reduceImageForUpload(fileBytes);
}
String fileName = FileHelper.getFileName(this, mMediaUri, mFileType);
ParseFile file = new ParseFile(fileName, fileBytes);
message.put(ParseConstants.KEY_FILE, file);
return message;
}
}
编辑我已经在模拟器上测试了代码,它正常工作,但是在实际设备上崩溃了。这是我的测试设备的摄像头软件的问题吗?该应用程序的MinSDK版本为14,tagetsdk版本为19,我测试的设备版本为16(4.1.2)
我完全不知所措
编辑我运行了调试器,并在byte[]fileBytes=FileHelper.getByteArrayFromFile(这是mMediaUri)处停止它代码>
一切似乎都很好,所以我让它一直运行到最后,现在一切都很完美,无论是在设备上还是在模拟器上
非常奇怪。哪里是getByteArrayFromFile(上下文上下文,Uri Uri)
invoked检查Uri是否为null?Raghunandan-我编辑了这个问题,以显示使用getByteArrayFromFile(上下文,Uri Uri Uri)的代码