Tell the Camera Intent to save the taken image

11,925

Solution 1

Use Like this:

Intent:

             Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(takePicture, 0);

To fetch that result:

 protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
       super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

       switch(requestCode) {
       case 0:
           if(resultCode == RESULT_OK){
           Uri selectedImage = imageReturnedIntent.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};

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

                   int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                  //file path of captured image
                   filePath = cursor.getString(columnIndex); 
                   //file path of captured image
                   File f = new File(filePath);
                   filename= f.getName();

                   Toast.makeText(SiteViewFieldCreate.this, "Your Path:"+filePath, 2000).show();
                   Toast.makeText(SiteViewFieldCreate.this, "Your Filename:"+filename, 2000).show();
                   cursor.close();

                 //Convert file path into bitmap image using below line.
                  // yourSelectedImage = BitmapFactory.decodeFile(filePath);


                  //put bitmapimage in your imageview
                  //yourimgView.setImageBitmap(yourSelectedImage);
      }
       break;
     }
    } 

Add this in your manifest.xml.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />


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

Hope this will give you some solution.

Solution 2

Nirmals solution works fine on all devices except on Android 4.x (Apilevel 15). Seems to be a bug, but imageReturnedIntent.getData() always returns null! (testet on emulator AND on device) The taken photo is not even saved on externaldir, so any attempt to get latest id or greatest date_added from ContentResolver will fail (returns the latest photo from card but not the taken photo)! Currently I have no solution for this problem...seems to be impossible to get the path for a taken picture on Apilevel 15 (while it's still possible to get the drawable and save by your own)...

Share:
11,925
Charlie-Blake
Author by

Charlie-Blake

ammut.network

Updated on June 05, 2022

Comments

  • Charlie-Blake
    Charlie-Blake almost 2 years

    I'm doing this:

    intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    final File storage = Environment.getExternalStorageDirectory();
    final Uri uri = Uri.fromFile(new File(storage, System.currentTimeMillis() + ".jpg"));
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    startActivityForResult(intent, id);
    

    and to handle get that photo, I do this:

    private String getLastImagePath() {
        final String[] imageColumns = { MediaStore.Images.Media._ID,
                MediaStore.Images.Media.DATA };
        final String imageOrderBy = MediaStore.Images.Media._ID + " DESC";
        final Cursor imageCursor = getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns,
                null, null, imageOrderBy);
        if (imageCursor.moveToFirst()) {
            final String fullPath = imageCursor.getString(imageCursor
                    .getColumnIndex(MediaStore.Images.Media.DATA));
            return fullPath;
        } else {
            throw new RuntimeException();
        }
    }
    

    However, I keep on getting messages like this one:

    07-02 14:46:54.751: E/BitmapFactory(23119): Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20130702_144653.jpg: open failed: ENOENT (No such file or directory)
    

    If I check the Gallery, the photo is not there, so my guess is that the Intent is ignoring the MediaStore.EXTRA_OUTPUT value.

    Is there anything I can do that does not involve writing my own Camera solution?