Getting a Null pointer exception when capturing and saving an image using android emulator

I am trying to capture and save an image via android emulator, the image is being captured but the saved file is corrupted.

What could be causing this? can anyone help me identify possible errors?

Below is my code:

**public void onCreate**(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    **Intent** intent = new **Intent**("android.media.action.IMAGE_CAPTURE");
    try {
        fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
    } 

    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    intent.putExtra(**MediaStore**.EXTRA_OUTPUT, fileUri);
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}

@Override
**protected void onActivityResult**(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            StoreImage(this, data.getData(),
            mediaFile);
            finish();
        } 

        else if (resultCode == RESULT_CANCELED) {
            // User cancelled the image capture
        } 

        else {
            finish();
            try {
            } 

            catch (Exception e) {
               e.printStackTrace();
            }
        }
    }

}

      

Stack trace below ::

04-05 23:55:40.369: E/AndroidRuntime(534): FATAL EXCEPTION: main
04-05 23:55:40.369: E/AndroidRuntime(534): java.lang.RuntimeException: Unable to start activity ComponentInfo{camera.android/camera.android.CameraActivity}: java.lang.NullPointerException: file
04-05 23:55:40.369: E/AndroidRuntime(534):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)

04-05 23:55:40.369: E/AndroidRuntime(534): Caused by: java.lang.NullPointerException: file
04-05 23:55:40.369: E/AndroidRuntime(534):  at android.net.Uri.fromFile(Uri.java:441)
04-05 23:55:40.369: E/AndroidRuntime(534):  at camera.android.CameraActivity.getOutputMediaFileUri(CameraActivity.java:72)
04-05 23:55:40.369: E/AndroidRuntime(534):  at camera.android.CameraActivity.onCreate(CameraActivity.java:34)
04-05 23:55:40.369: E/AndroidRuntime(534):  at android.app.Activity.performCreate(Activity.java:4465)
04-05 23:55:40.369: E/AndroidRuntime(534):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-05 23:55:40.369: E/AndroidRuntime(534):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)

      

+3


source to share


4 answers


check if you have added the following permission in your manifest file ::

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

      

also in



fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

      

I think you should attach the filename you want to save too and giving only the path is not enough.

+4


source


Change this line,

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
                if (resultCode == RESULT_OK) {

      

to



 if (resultCode == RESULT_OK) {
                    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {

      

First check if the child operation was successful or not.

+4


source


"@Agarwal: when calling onActivityResult"

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                StoreImage(this, data.getData(), mediaFile);
                finish();

            } else if (resultCode == RESULT_CANCELED) {
                // User cancelled the image capture
            } else {
                finish();
                try {

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }

    }

      

"If the result is success, then the data from intern is stored in file n, which is created and saved as jpeg format"

public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) {
        Bitmap bm = null;
        try {
            bm = Media.getBitmap(mContext.getContentResolver(), imageLoc);
            FileOutputStream out = new FileOutputStream(imageDir);
            bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
            bm.recycle();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

      

+1


source


try under code,

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

    File file=getOutputMediaFile(1);
    picUri = Uri.fromFile(file); // create
    i.putExtra(MediaStore.EXTRA_OUTPUT,picUri); // set the image file

    startActivityForResult(i, CAPTURE_IMAGE);

      

where getOutputMediaFile (int) will be,

/** Create a File for saving an image */
private  File getOutputMediaFile(int type){
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
              Environment.DIRECTORY_PICTURES), "MyApplication");

    /**Create the storage directory if it does not exist*/
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    }

    /**Create a media file name*/
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == 1){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "IMG_"+ timeStamp + ".png");
    } else {
        return null;
    }

    return mediaFile;
}

      

and finally

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {
        Intent i;
        switch (requestCode) {
        case CAPTURE_IMAGE:
            //THIS IS YOUR Uri
            Uri uri=picUri; 
            break;
        }
    }   
}

      

amuses .... :)

0


source







All Articles