Android - Camera intent low bitmap quality

27,244

Solution 1

Don't use bitmap, use uri instead.

 ImageView imageView;
 Uri image;
 String mCameraFileName;

 private void cameraIntent() {
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());
        Intent intent = new Intent();
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);

        Date date = new Date();
        DateFormat df = new SimpleDateFormat("-mm-ss");

        String newPicFile = df.format(date) + ".jpg";
        String outPath = "/sdcard/" + newPicFile;
        File outFile = new File(outPath);

        mCameraFileName = outFile.toString();
        Uri outuri = Uri.fromFile(outFile);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outuri);
        startActivityForResult(intent, 2);
    }

  @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == 2) {
                if (data != null) {
                    image = data.getData();
                    imageView.setImageURI(image);
                    imageView.setVisibility(View.VISIBLE);
                }
                if (image == null && mCameraFileName != null) {
                    image = Uri.fromFile(new File(mCameraFileName));
                    imageView.setImageURI(image);
                    imageView.setVisibility(View.VISIBLE);
                }
                File file = new File(mCameraFileName);
                if (!file.exists()) {
                    file.mkdir();
                }
            }
        }
    }

Solution 2

in your cameraIntent you need to specify the uri when the camera activity will save the picture with the full resolution:

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, capturedImageUri);

if you don't specify that you just receive a thumbnail in the onActivityResult. So you specify that and you read the image from the uri.

So in your onActivityResult you should do:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(capturedImageUri, options);

that's it.

Share:
27,244
Meindert Stijfhals
Author by

Meindert Stijfhals

Updated on July 09, 2022

Comments

  • Meindert Stijfhals
    Meindert Stijfhals almost 2 years

    When taking a picture using the android camera Intent, I get a low-quality bitmap image. I was wondering if it is possible to make this image decent quality.

    I googled some information about it and I think that I have to use 'EXTRA_OUTPUT' (http://developer.android.com/reference/android/provider/MediaStore.html#ACTION_IMAGE_CAPTURE)

    I am struggling because I don't know where to place it and I don't know if it will solve my problem.

    After pressing btnTakePhoto, I change layout and open the android camera. The bitmap shows up in a second layout (low quality). Here is my code:

    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.provider.MediaStore;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    
    public class Camera extends AppCompatActivity {
        ImageButton btnTakePhoto;
        ImageView imgTakenPhoto;
        private static final int CAM_REQUEST = 1313;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.camera);
    
            btnTakePhoto = (ImageButton) findViewById(R.id.buttonFoto);
            imgTakenPhoto = (ImageView) findViewById(R.id.genomenFoto);
    
    
        btnTakePhoto.setOnClickListener(new btnTakePhotoClicker());
    }
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if(requestCode == CAM_REQUEST){
                setContentView(R.layout.share);
                Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
                imgTakenPhoto = (ImageView) findViewById(R.id.genomenFoto);
                imgTakenPhoto.setImageBitmap(thumbnail);
            }
        }
    
        class btnTakePhotoClicker implements Button.OnClickListener {
    
            @Override
            public void onClick(View v) {
                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(cameraIntent, CAM_REQUEST);
            }
        }
    
        //CameraShare layout -- back button - Go back to first layout
        public void ibBackToPhotograph(View v) {
            setContentView(R.layout.camera);
            btnTakePhoto = (ImageButton) findViewById(R.id.buttonFoto);
            btnTakePhoto.setOnClickListener(new btnTakePhotoClicker());
        }
    }
    

    EDIT: The image isn't saved anywhere. It's ment to be posted on facebook after you accept it (snapchat)