NullPointerException, когда я пытаюсь захватить изображение (встроенная камера) и сохранить его в файл

Вот что делает приложение: пользователь нажимает кнопку (чтобы сделать снимок) в действии A, захваченное изображение устанавливается как в ImageView в действии A, а затем пользователь нажимает кнопку «сохранить», которая переводит его/ее в действие B, где отображается изображение, которое они сделали (в ImageView в действии B)

Для этого я пытаюсь найти способ сохранить изображение. Я пробовал много разных вещей, но я продолжаю получать исключение NullPointerException. Вот мой код:

Я выделил область, где, по моему мнению, ошибка:

 public void onClick(View view) {
    switch (view.getId()) {
        case R.id.take_picture_button:
            takePic = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            if (takePic.resolveActivity(getPackageManager()) != null) {
                File photoFile = null;
                try {
                    photoFile = createImageFile(); //so photoFile = the file we created up top
                } catch (IOException ex) {
                    // Error occurred while creating the File
                    ex.printStackTrace();

                }
                // Continue only if the File was successfully created
                if (photoFile != null) {

                    **takePic.putExtra(MediaStore.EXTRA_OUTPUT**, //extra_output is just the name of the Intent-extra used to indicate a content resolver Uri to be used to store the requested image or video.
                            **Uri.fromFile(photoFile));**
                    startActivityForResult(takePic, cameraData);
                }

А вот код для onActivityResult

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == cameraData && resultCode == RESULT_OK) {
        mReturningWithResult = true;
        extras = data.getExtras();

И вот где я установил свой вид изображения для моего захваченного изображения (в действии A)

@Override
protected void onPostResume() {
    super.onPostResume();
    if (mReturningWithResult) {
        foodImage = (Bitmap) extras.get("data");
        foodImageView.setImageBitmap(foodImage);
    }
    mReturningWithResult = false;//resetting it for next time

}

Вот logcat (извините, я новичок в этом)

    10-15 20:58:59.612  32005-32005/com.example.nikhil.foodshark D/OpenGLRenderer﹕ Enabling debug mode    0
10-15 20:59:21.545  32005-32005/com.example.nikhil.foodshark I/PersonaManager﹕ getPersonaService() name persona_policy
10-15 20:59:23.127  32005-32005/com.example.nikhil.foodshark W/IInputConnectionWrapper﹕ showStatusIcon on inactive InputConnection
10-15 20:59:33.678  32005-32005/com.example.nikhil.foodshark D/AndroidRuntime﹕ Shutting down VM
10-15 20:59:33.678  32005-32005/com.example.nikhil.foodshark W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41a39da0)
10-15 20:59:33.678  32005-32005/com.example.nikhil.foodshark E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.nikhil.foodshark, PID: 32005
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.example.nikhil.foodshark/com.example.nikhil.foodshark.NewDish}: java.lang.NullPointerException
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3680)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3723)
            at android.app.ActivityThread.access$1400(ActivityThread.java:174)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5593)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.example.nikhil.foodshark.NewDish.onActivityResult(NewDish.java:144)
            at android.app.Activity.dispatchActivityResult(Activity.java:5650)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3676)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3723)
            at android.app.ActivityThread.access$1400(ActivityThread.java:174)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5593)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)
10-15 20:59:56.353  32005-32005/com.example.nikhil.foodshark I/Process﹕ Sending signal. PID: 32005 SIG: 9
10-15 20:59:56.613      378-378/com.example.nikhil.foodshark I/PersonaManager﹕ getPersonaService() name persona_policy
10-15 20:59:56.723      378-378/com.example.nikhil.foodshark I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:381>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_KK_2.7_RB1.04.04.02.007.050_msm8960_refs/tags/AU_LINUX_ANDROID_KK_2.7_RB1.04.04.02.007.050__release_AU ()
    OpenGL ES Shader Compiler Version: 17.01.12.SPL
    Build Date: 03/28/14 Fri
    Local Branch:
    Remote Branch: refs/tags/AU_LINUX_ANDROID_KK_2.7_RB1.04.04.02.007.050
    Local Patches: NONE
    Reconstruct Branch: NOTHING
10-15 20:59:56.763      378-378/com.example.nikhil.foodshark D/OpenGLRenderer﹕ Enabling debug mode 0

Ребята, вы знаете, как я могу это исправить? Спасибо!


person Nikhil Bhaskar    schedule 16.10.2014    source источник
comment
Что такое исключение нулевого указателя? Пожалуйста, опубликуйте трассировку стека.   -  person Matt Clark    schedule 16.10.2014
comment
не говорите ..где, я думаю, ошибка. трассировка стека точно указывает, где ошибка. опубликовать это здесь   -  person DnR    schedule 16.10.2014
comment
я не вижу выделенных областей, я вижу только комментарии, также опубликуйте свою трассировку стека, чтобы мы могли помочь   -  person danidee    schedule 16.10.2014
comment
Эй, ребята, извините, я новичок в этом - я разместил логарифм   -  person Nikhil Bhaskar    schedule 16.10.2014
comment
Что такое строка NewDish 144?   -  person Code-Apprentice    schedule 16.10.2014
comment
Строка NewDish 144 — это extras = data.getExtras(); из моего метода onActivityResult()   -  person Nikhil Bhaskar    schedule 16.10.2014
comment
Есть ли что-то, что я могу добавить или удалить (кроме EXTRA-OUTPUT), чтобы мое намерение не было нулевым?   -  person Nikhil Bhaskar    schedule 16.10.2014
comment
добавьте проверку для data.getExtras() для проверки нулевого значения - это предосторожность.. также что такое переменная extras ??   -  person Elltz    schedule 16.10.2014
comment
переменная extras является Bundle   -  person Nikhil Bhaskar    schedule 16.10.2014


Ответы (1)


Вы передаете MediaStore.EXTRA_OUTPUT, и в этом случае поле intent в onActivityResult может быть нулевым.

Решение состоит в том, чтобы просто использовать созданный вами файл фотографии, переданный как uri в поле putExtra.

Поэтому вместо того, чтобы пытаться получить местоположение файла фотографии из намерения, просто используйте Uri.fromFile(photoFile)

заменять

    extras = data.getExtras();
    ...

с участием

   `Uri.fromFile(photoFile)`

или просто используйте photoFile, если это то, что вы хотите... просто не полагайтесь на намерение data

person ashoke    schedule 16.10.2014
comment
Спасибо, ashoke, а также всем, кто помог - теперь, кажется, я понял! - person Nikhil Bhaskar; 17.10.2014