Android Camera Intent: how to get full sized photo? Android Camera Intent: how to get full sized photo? android android

Android Camera Intent: how to get full sized photo?


To get full sized camera image you should point camera to save picture in temporary file, like:

    private URI mImageUri;    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");    File photo;    try    {        // place where to store camera taken picture        photo = this.createTemporaryFile("picture", ".jpg");        photo.delete();    }    catch(Exception e)    {        Log.v(TAG, "Can't create file to take picture!");        Toast.makeText(activity, "Please check SD card! Image shot is impossible!", 10000);        return false;    }    mImageUri = Uri.fromFile(photo);    intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);    //start camera intent    activity.startActivityForResult(this, intent, MenuShootImage);private File createTemporaryFile(String part, String ext) throws Exception{    File tempDir= Environment.getExternalStorageDirectory();    tempDir=new File(tempDir.getAbsolutePath()+"/.temp/");    if(!tempDir.exists())    {        tempDir.mkdirs();    }    return File.createTempFile(part, ext, tempDir);}

Then after image capture intent finished to work - just grab your picture from imageUri using following code:

public void grabImage(ImageView imageView){    this.getContentResolver().notifyChange(mImageUri, null);    ContentResolver cr = this.getContentResolver();    Bitmap bitmap;    try    {        bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, mImageUri);        imageView.setImageBitmap(bitmap);    }    catch (Exception e)    {        Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT).show();        Log.d(TAG, "Failed to load", e);    }}//called after camera intent finished@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent intent){    //MenuShootImage is user defined menu option to shoot image    if(requestCode==MenuShootImage && resultCode==RESULT_OK)     {       ImageView imageView;       //... some code to inflate/create/find appropriate ImageView to place grabbed image       this.grabImage(imageView);    }    super.onActivityResult(requestCode, resultCode, intent);}

P.S. Code need to be revised with respect to new security restriction applied in Android M - FileProvider: mImageUri has to be packed with FileProvider


Open Camera and save image into some specific directory

private String pictureImagePath = "";private void openBackCamera() {    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());    String imageFileName = timeStamp + ".jpg";    File storageDir = Environment.getExternalStoragePublicDirectory(            Environment.DIRECTORY_PICTURES);    pictureImagePath = storageDir.getAbsolutePath() + "/" + imageFileName;    File file = new File(pictureImagePath);    Uri outputFileUri = Uri.fromFile(file);    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);                   cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);    startActivityForResult(cameraIntent, 1);}

Handle Image

protected void onActivityResult(int requestCode, int resultCode, Intent data) {    if (requestCode == 1) {    File imgFile = new  File(pictureImagePath);        if(imgFile.exists()){               Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());       ImageView myImage = (ImageView) findViewById(R.id.imageviewTest);       myImage.setImageBitmap(myBitmap);        }    }}


Even though this is an old question and it has an accepted answer,
I would like to share my solution.
In this case you don't have to create a temporary file.
Additionally we creating a chooser which offers to user both: take a picture with the camera or pick an existing one from a gallery.

    Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);    Intent chooser = new Intent(Intent.ACTION_CHOOSER);    chooser.putExtra(Intent.EXTRA_INTENT, galleryIntent);    chooser.putExtra(Intent.EXTRA_TITLE, getString(R.string.chooseaction));    Intent[] intentArray = {cameraIntent};    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);    startActivityForResult(chooser, RESULT_LOAD_IMAGE);

and here we retrieving results:

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {    // todo use appropriate resultCode in your case    if (requestCode == RESULT_LOAD_IMAGE && resultCode == FragmentActivity.RESULT_OK) {        if (data.getData() != null) {            // this case will occur in case of picking image from the Gallery,            // but not when taking picture with a camera            try {                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), data.getData());                // do whatever you want with the Bitmap ....                       } catch (IOException e) {                e.printStackTrace();            }        } else {            // this case will occur when taking a picture with a camera            Bitmap bitmap = null;            Cursor cursor = getActivity().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,                    new String[]{MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_ADDED,                            MediaStore.Images.ImageColumns.ORIENTATION}, MediaStore.Images.Media.DATE_ADDED,                    null, "date_added DESC");            if (cursor != null && cursor.moveToFirst()) {                Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)));                String photoPath = uri.toString();                cursor.close();                if (photoPath != null) {                    bitmap = BitmapFactory.decodeFile(photoPath);                }            }            if (bitmap == null) {                // for safety reasons you can                // use thumbnail if not retrieved full sized image                bitmap = (Bitmap) data.getExtras().get("data");            }            // do whatever you want with the Bitmap ....        }        super.onActivityResult(requestCode, resultCode, data);    }}