android camera : Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity

63,401

Solution 1

Make sure you have both Camera Permission and READ/WRITE External Storage Permissions.

Try this is working like charm with me

private String selectedImagePath = "";
    final private int PICK_IMAGE = 1;
    final private int CAPTURE_IMAGE = 2;

public Uri setImageUri() {
        // Store image in dcim
        File file = new File(Environment.getExternalStorageDirectory() + "/DCIM/", "image" + new Date().getTime() + ".png");
        Uri imgUri = Uri.fromFile(file);
        this.imgPath = file.getAbsolutePath();
        return imgUri;
    }


    public String getImagePath() {
        return imgPath;
    }

btnGallery.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE);

            }
        });

        btnCapture.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, setImageUri());
                startActivityForResult(intent, CAPTURE_IMAGE);
            }
        });

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != Activity.RESULT_CANCELED) {
            if (requestCode == PICK_IMAGE) {
                selectedImagePath = getAbsolutePath(data.getData());
                imgUser.setImageBitmap(decodeFile(selectedImagePath));
            } else if (requestCode == CAPTURE_IMAGE) {
                selectedImagePath = getImagePath();
                imgUser.setImageBitmap(decodeFile(selectedImagePath));
            } else {
                super.onActivityResult(requestCode, resultCode, data);
            }
        }

    }


public Bitmap decodeFile(String path) {
        try {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(path, o);
            // The new size we want to scale to
            final int REQUIRED_SIZE = 70;

            // Find the correct scale value. It should be the power of 2.
            int scale = 1;
            while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE)
                scale *= 2;

            // Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeFile(path, o2);
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;

    }

public String getAbsolutePath(Uri uri) {
        String[] projection = { MediaColumns.DATA };
        @SuppressWarnings("deprecation")
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        if (cursor != null) {
            int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } else
            return null;
    }

Solution 2

Try this, Yesterday i had same problem. using below code i rectify problem. just try on it.

Note : And also add configChanges for particular activity. while calling the camera intent activity will be refreshed. you need to avoid that. android:configChanges="orientation|keyboardHidden|screenSize"

btnGallery.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
           intent = new Intent(Intent.ACTION_PICK);
                            intent.setType("image/*");
                            startActivityForResult(intent, 1);
        }
    });

    btnCapture.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(
                                    MediaStore.ACTION_IMAGE_CAPTURE);
                            File file = new File(Environment
                                    .getExternalStorageDirectory(),
                                    "test.jpg");

                            outputFileUri = Uri.fromFile(file);
                            Log.d("TAG", "outputFileUri intent"
                                    + outputFileUri);
                            intent.putExtra(MediaStore.EXTRA_OUTPUT,
                                    outputFileUri);
                            startActivityForResult(intent, 0);
        }
    });

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    case 0:
        if (resultCode == RESULT_OK) {
            Log.d("TAG", "outputFileUri RESULT_OK" + outputFileUri);
            if (outputFileUri != null) {

                Bitmap bitmap;
                bitmap = decodeSampledBitmapFromUri(outputFileUri,
                        image.getWidth(), image.getHeight());

                if (bitmap == null) {
                    Toast.makeText(getApplicationContext(),
                            "the image data could not be decoded",
                            Toast.LENGTH_LONG).show();

                } else {
                    Toast.makeText(
                            getApplicationContext(),
                            "Decoded Bitmap: " + bitmap.getWidth() + " x "
                                    + bitmap.getHeight(), Toast.LENGTH_LONG)
                            .show();
                    image.setImageBitmap(bitmap);
                }
            }
        }
        break;
    case 1:
        if (resultCode == RESULT_OK) {
            Uri targetUri = data.getData();
            Log.d("TAG", "datae" + targetUri);
            Bitmap bitmap;
            bitmap = decodeSampledBitmapFromUri(targetUri,
                    image.getWidth(), image.getHeight());

            if (bitmap == null) {
                Toast.makeText(getApplicationContext(),
                        "the image data could not be decoded",
                        Toast.LENGTH_LONG).show();

            } else {
                Toast.makeText(
                        getApplicationContext(),
                        "Decoded Bitmap: " + bitmap.getWidth() + " x "
                                + bitmap.getHeight(), Toast.LENGTH_LONG)
                        .show();
                image.setImageBitmap(bitmap);
            }
        }
        break;

    default:
        break;
    }
}

public Bitmap decodeSampledBitmapFromUri(Uri uri, int reqWidth,
        int reqHeight) {

    Bitmap bm = null;

    try {
        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(getContentResolver()
                .openInputStream(uri), null, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth,
                reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        bm = BitmapFactory.decodeStream(getContentResolver()
                .openInputStream(uri), null, options);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        Toast.makeText(getApplicationContext(), e.toString(),
                Toast.LENGTH_LONG).show();
    }

    return bm;
}

public int calculateInSampleSize(BitmapFactory.Options options,
        int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        if (width > height) {
            inSampleSize = Math.round((float) height / (float) reqHeight);
        } else {
            inSampleSize = Math.round((float) width / (float) reqWidth);
        }
    }
    return inSampleSize;
}

Solution 3

I think following line causes the issue.

Bitmap photo = (Bitmap) data.getExtras().get("data"); 

You pass the file uri already as following

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);

When you pass EXTRA_OUTPUT with a URI, the intent you receive in onActivityResult() will be null. If you want to get image in this method, fetch image with the path you pass with EXTRA_OUTPUT.

Solution 4

More cleaner code , might help someone looking for answer , basically when you save file to external storage bundle no more has bitmap in result , instead you have to load from file

String fileName;
.
. 
private void takePicture() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File

        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                    Uri.fromFile(photoFile));
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)        {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {

       loadImageFromFile();
    }
}
public void loadImageFromFile(){

    ImageView view = (ImageView)this.findViewById(R.id.imageViewHeader);
    view.setVisibility(View.VISIBLE);


    int targetW = view.getWidth();
    int targetH = view.getHeight();

    // Get the dimensions of the bitmap
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(fileName, bmOptions);
    int photoW = bmOptions.outWidth;
    int photoH = bmOptions.outHeight;

    // Determine how much to scale down the image
    int scaleFactor = Math.min(photoW/targetW, photoH/targetH);

    // Decode the image file into a Bitmap sized to fill the View
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inSampleSize = scaleFactor;
    bmOptions.inPurgeable = true;

    Bitmap bitmap = BitmapFactory.decodeFile(fileName, bmOptions);
    view.setImageBitmap(bitmap);
}
private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    fileName =  image.getAbsolutePath();
    return image;
}
Share:
63,401
Aoyama Nanami
Author by

Aoyama Nanami

Junior Mobile Programming for android

Updated on September 04, 2021

Comments

  • Aoyama Nanami
    Aoyama Nanami over 2 years

    i've really frustased to solve my problem, i have an application that using camera, when camera capture a photo, it will display on activity, when i'm not using cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); photo will display on activity, but the name and path file is not like what i wanted. i'm using galaxy tab for compiling it, i have follow tutorial to solve my problem from here , here and here but my application still force close and eror, this is my code :

    {
        File sdCard = Environment.getExternalStorageDirectory();
        File path = new File (sdCard.getAbsolutePath() + "/android/data/spaj_foto");
        path.mkdir();
        File file = new File (path,"spaj_foto.png");
        String filePath ="/android/data/spaj_foto/spaj_foto.png";
    
        try {
            file.createNewFile();
        } catch (IOException e) {}       
    
    
        mPhotoUri = Uri.fromFile(file); 
        values.put(MediaStore.Images.ImageColumns.DATA, file.getPath());
        mPhotoUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);
        startActivityForResult(cameraIntent,TAKE_PHOTO_CODE );  
    
    }
    

    activityresult method :

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
            Bitmap photo = (Bitmap) data.getExtras().get("data"); 
            image_spaj.setImageBitmap(photo);
    
    
            // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
            Uri tempUri = getImageUri(getApplicationContext(), photo);
    
            // CALL THIS METHOD TO GET THE ACTUAL PATH
            File finalFile = new File(getRealPathFromURI(tempUri));
    
    //              System.out.println(mImageCaptureUri);
        }  
    }
    public String getRealPathFromURI(Uri mPhotoUri) {
        Cursor cursor = getContentResolver().query(mPhotoUri, null, null, null, null); 
        cursor.moveToFirst(); 
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
        return cursor.getString(idx); 
    }
    
    public Uri getImageUri(Context inContext, Bitmap inImage) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
        return Uri.parse(path);
    }
    

    this is my logcat says:

        09-27 10:59:43.186: E/AndroidRuntime(31318): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {org.example.touch/org.example.touch.FormSpaj}: java.lang.NullPointerException
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3179)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3222)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread.access$1100(ActivityThread.java:140)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1276)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.os.Handler.dispatchMessage(Handler.java:99)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.os.Looper.loop(Looper.java:137)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread.main(ActivityThread.java:4895)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at java.lang.reflect.Method.invokeNative(Native Method)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at java.lang.reflect.Method.invoke(Method.java:511)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at dalvik.system.NativeStart.main(Native Method)
    09-27 10:59:43.186: E/AndroidRuntime(31318): Caused by: java.lang.NullPointerException
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at org.example.touch.FormSpaj.onActivityResult(FormSpaj.java:993)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.Activity.dispatchActivityResult(Activity.java:5347)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3175)
    09-27 10:59:43.186: E/AndroidRuntime(31318):    ... 11 more
    

    i really hope someone can help me to solve my problem, i already stack and can't thinking anyway again, please someone help me... thank you.

  • Aoyama Nanami
    Aoyama Nanami over 10 years
    thank you for your help... but i have one question, why when i capture another image, this is not rewrite the image that have created before?
  • Biraj Zalavadia
    Biraj Zalavadia over 10 years
    because we generate unique uri in this method setImageUri() by appending current time milliseconds. If you want to overwrite the file give static hard coded file name in setImageUri() method.
  • Aoyama Nanami
    Aoyama Nanami over 10 years
    i have made like this : File file = new File(Environment.getExternalStorageDirectory() +"/android/data/spaj_foto/spaj_foto.png"); Uri imgUri = Uri.fromFile(file); this.imgPath = file.getAbsolutePath();
  • RichArt
    RichArt about 7 years
    This helped. Thank you! I was still trying to Bitmap picture = (Bitmap) data.getExtras().get("data");
  • Andro Selva
    Andro Selva over 6 years
    This really works. I started facing crash issue on Android 7.0 and removing this line did the trick. Also removing this line didn't affect pre-nougat devices as well. Tested from Android 4.4 and above.
  • rajat singh
    rajat singh over 5 years
    This will not work like a charm for the Android version running above Android N, only working for the Android Versions below N
  • Jeeva
    Jeeva over 4 years
    @Jose Jithin bro u r awesome