Question

This code worked on samsung before but now that i'm using Nexus One with Android 2.3.6, it's crashing as soon as I take a picture and click ok or choose a photo from gallery. Stacktrace shows a null pointer exception on the Uri.
My code for the activating the camera is as follows:

public void activateCamera(View view){      
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // start the image capture Intent
    startActivityForResult(i, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if ((requestCode == CHOOSE_IMAGE_ACTIVITY_REQUEST_CODE  || requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) 
        && resultCode == RESULT_OK && null != data) {

        selectedImage = data.getData();

        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);

        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);

        String picturePath = cursor.getString(columnIndex);

        cursor.close();

        Bitmap bits = null;

        BitmapFactory.Options options = new BitmapFactory.Options();

        options.inSampleSize = inSampleSize;

        try {
            bits = BitmapFactory.decodeStream(new FileInputStream(picturePath),null,options);
        } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }

Any idea what could be the problem? Thanks!

Was it helpful?

Solution

You have to tell the camera, where to save the picture and remeber the uri yourself:

private Uri mMakePhotoUri;

private File createImageFile() {
    // return a File object for your image.
}

private void makePhoto() {
    try {
        File f = createImageFile();
        Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        mMakePhotoUri = Uri.fromFile(f);
        i.putExtra(MediaStore.EXTRA_OUTPUT, mMakePhotoUri);
        startActivityForResult(i, REQUEST_MAKE_PHOTO);
    } catch (IOException e) {
        Log.e(TAG, "IO error", e);
        Toast.makeText(getActivity(), R.string.error_writing_image, Toast.LENGTH_LONG).show();
    }
}

@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    switch (requestCode) {
        case REQUEST_MAKE_PHOTO:
            if (resultCode == Activity.RESULT_OK) {
                // do something with mMakePhotoUri
            }
            return;
        default: // do nothing
            super.onActivityResult(requestCode, resultCode, data);
    }
}

You should save the value of mMakePhotoUri over instance states withing onCreate() and onSaveInstanceState().

OTHER TIPS

Inject this extra into the Intent that called onActivityResult and the system will do all the heavy lifting for you.

File f = createImageFile();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));

Doing this makes it as easy as this to retrieve the photo as a bitmap.

private void handleSmallCameraPhoto(Intent intent) {
    Bundle extras = intent.getExtras();
    mImageBitmap = (Bitmap) extras.get("data");
    mImageView.setImageBitmap(mImageBitmap);
}

dont pass any extras, just define the path where you have placed or saved the file directly in onActivityResult

 public void openCamera() {

    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    file = createImageFile();
    boolean isDirectoryCreated = file.getParentFile().mkdirs();
    Log.d("", "openCamera: isDirectoryCreated: " + isDirectoryCreated);
    if (Build.VERSION.SDK_INT >= 23) {
        tempFileUri = FileProvider.getUriForFile(getActivity().getApplicationContext(),
                "com.scanlibrary.provider", // As defined in Manifest
                file);
    } else {
        tempFileUri = Uri.fromFile(file);
    }

    try
    {
        cameraIntent.putExtra("return-data", true);
        startActivityForResult(cameraIntent, ScanConstants.START_CAMERA_REQUEST_CODE);
    }
    catch (Exception e)
    {
    }
}

private File createImageFile() {
    clearTempImages();
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new
            Date());
    File file = new File(ScanConstants.IMAGE_PATH, "IMG_" + timeStamp +
            ".jpg");
    fileUri = Uri.fromFile(file);
    return file;
}

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

    Bitmap bitmap = null ;
    if (resultCode == Activity.RESULT_OK ) {
        try {
            if (Build.VERSION.SDK_INT >= 23) {
                    tempFileUri = FileProvider.getUriForFile(getActivity().getApplicationContext(),
                            "com.scanlibrary.provider", // As defined in Manifest
                            file);
                } else {
                    tempFileUri = Uri.fromFile(file);
                }

                    bitmap = getBitmap(tempFileUri);



                    bitmap = getBitmap(data.getData());

        } catch (Exception e) {
            e.printStackTrace();
        }
    } else {
        getActivity().finish();
    }
    if (bitmap != null) {
        postImagePick(bitmap);
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top