Java 从github下载的FileHelper类的NullPointerException

Java 从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

我正在跟随一个视频指南/教程从Treehouse为Android制作一个自毁信息应用程序。在我从github下载FileHelper类(由视频指南中的家伙编写)之前,一切都很顺利

现在,当我运行应用程序并在通过设备的gallery选择照片/视频后尝试向后端发送消息时,它工作正常,但当我从设备摄像头选择照片/视频时,它崩溃,我在logcat中得到一个nullPointerException

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)的代码