Search code examples
androidimageimageviewandroid-imageviewcrop

How to Get Correct Path After Cropping the Image?


I want to Crop the Capture/Selected Image and Upload it on to server.

What Problem I am Facing : After Cropping the Image i am not getting actual path for that Cropped Image. i have done my code below way. i am croping the image correctly also everything works fine here but imageview is not displaying original image instead of cropped image.

However when i have fetched bitmap with Bitmap photo = extras.getParcelable("data"); inside onActivityResult() i am getting Cropped image displayed in imageview.but not getting able to absolute path for that Cropped Image.

Can Anybody please guide me where i am lacking. i have tried with many SO links but not able to get exact solution for my issue.

Here is My Code :

public class MainActivity extends Activity {
    private Uri mImageCaptureUri;
    private ImageView mImageView;

    private static final int PICK_FROM_CAMERA = 1;
    private static final int CROP_FROM_CAMERA = 2;
    private static final int PICK_FROM_FILE = 3;

    private String selectedImagePath = "";
    boolean GallaryPhotoSelected = false;

    public static String Finalmedia = "";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        final String[] items = new String[] { "Take from camera",
                "Select from gallery" };
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.select_dialog_item, items);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setTitle("Select Image");
        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) { // pick from
                                                                    // camera
                if (item == 0) {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                    mImageCaptureUri = Uri.fromFile(new File(Environment
                            .getExternalStorageDirectory(), "tmp_avatar_"
                            + String.valueOf(System.currentTimeMillis())
                            + ".jpg"));

                    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
                            mImageCaptureUri);

                    try {
                        intent.putExtra("return-data", true);

                        startActivityForResult(intent, PICK_FROM_CAMERA);
                    } catch (ActivityNotFoundException e) {
                        e.printStackTrace();
                    }
                } else { // pick from file
                    Intent intent = new Intent();

                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);

                    startActivityForResult(Intent.createChooser(intent,
                            "Complete action using"), PICK_FROM_FILE);
                }
            }
        });

        final AlertDialog dialog = builder.create();

        Button button = (Button) findViewById(R.id.btn_crop);
        mImageView = (ImageView) findViewById(R.id.iv_photo);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.show();
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK)
            return;

        switch (requestCode) {
        case PICK_FROM_CAMERA:
            doCrop();

            break;

        case PICK_FROM_FILE:
            mImageCaptureUri = data.getData();
            Log.i("TAG",
                    "After Crop mImageCaptureUri " + mImageCaptureUri.getPath());
            GallaryPhotoSelected = true;
            doCrop();

            break;

        case CROP_FROM_CAMERA:
            Bundle extras = data.getExtras();

            selectedImagePath = mImageCaptureUri.getPath();

            Log.i("TAG", "After Crop selectedImagePath " + selectedImagePath);

            if (GallaryPhotoSelected) {
                selectedImagePath = getRealPathFromURI(mImageCaptureUri);
                Log.i("TAG", "Absolute Path " + selectedImagePath);
                GallaryPhotoSelected = true;
            }

            Finalmedia = selectedImagePath;

            Log.i("TAG", "Finalmedia Path " + Finalmedia);

            if (extras != null) {
                Bitmap photo = extras.getParcelable("data");

                Bitmap bm = BitmapFactory.decodeFile(Finalmedia);

                mImageView.setImageBitmap(bm);
            }

            // File f = new File(mImageCaptureUri.getPath());
            //
            // if (f.exists()) f.delete();

            break;

        }
    }

    public static Bitmap decodeFile(String path) {
        int orientation;
        try {
            if (path == null) {
                return null;
            }
            // decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            // Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE = 70;
            int width_tmp = o.outWidth, height_tmp = o.outHeight;
            int scale = 2;
            // while (true) {
            // if (width_tmp / 2 < REQUIRED_SIZE
            // || height_tmp / 2 < REQUIRED_SIZE)
            // break;
            // width_tmp /= 2;
            // height_tmp /= 2;
            // scale++;
            // }
            // decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            Bitmap bm = BitmapFactory.decodeFile(path, o2);
            Bitmap bitmap = bm;

            ExifInterface exif = new ExifInterface(path);

            orientation = exif
                    .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);

            Log.e("ExifInteface .........", "rotation =" + orientation);

            // exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90);

            Log.e("orientation", "" + orientation);
            Matrix m = new Matrix();

            if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) {
                m.postRotate(180);
                // m.postScale((float) bm.getWidth(), (float) bm.getHeight());
                // if(m.preRotate(90)){
                Log.e("in orientation", "" + orientation);
                bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                        bm.getHeight(), m, true);
                return bitmap;
            } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
                m.postRotate(90);
                Log.e("in orientation", "" + orientation);
                bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                        bm.getHeight(), m, true);
                return bitmap;
            } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
                m.postRotate(270);
                Log.e("in orientation", "" + orientation);
                bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                        bm.getHeight(), m, true);
                return bitmap;
            }
            return bitmap;
        } catch (Exception e) {
            return null;
        }

    }

    public String getRealPathFromURI(Uri contentUri) {
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(contentUri, proj, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

    private void doCrop() {
        final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();

        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setType("image/*");

        List<ResolveInfo> list = getPackageManager().queryIntentActivities(
                intent, 0);

        int size = list.size();

        if (size == 0) {
            Toast.makeText(this, "Can not find image crop app",
                    Toast.LENGTH_SHORT).show();

            return;
        } else {
            intent.setData(mImageCaptureUri);

            intent.putExtra("outputX", 200);
            intent.putExtra("outputY", 200);
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
            intent.putExtra("scale", true);
            intent.putExtra("return-data", true);

            if (size == 1) {
                Intent i = new Intent(intent);
                ResolveInfo res = list.get(0);

                i.setComponent(new ComponentName(res.activityInfo.packageName,
                        res.activityInfo.name));

                startActivityForResult(i, CROP_FROM_CAMERA);
            } else {
                for (ResolveInfo res : list) {
                    final CropOption co = new CropOption();

                    co.title = getPackageManager().getApplicationLabel(
                            res.activityInfo.applicationInfo);
                    co.icon = getPackageManager().getApplicationIcon(
                            res.activityInfo.applicationInfo);
                    co.appIntent = new Intent(intent);

                    co.appIntent
                            .setComponent(new ComponentName(
                                    res.activityInfo.packageName,
                                    res.activityInfo.name));

                    cropOptions.add(co);
                }

                CropOptionAdapter adapter = new CropOptionAdapter(
                        getApplicationContext(), cropOptions);

                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("Choose Crop App");
                builder.setAdapter(adapter,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int item) {
                                startActivityForResult(
                                        cropOptions.get(item).appIntent,
                                        CROP_FROM_CAMERA);
                            }
                        });

                builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialog) {

                        if (mImageCaptureUri != null) {
                            getContentResolver().delete(mImageCaptureUri, null,
                                    null);
                            mImageCaptureUri = null;
                        }
                    }
                });

                AlertDialog alert = builder.create();

                alert.show();
            }
        }
    }
}

Solution

  • After spending hours on this issue i finally make it work by Below Way if some one is having this problem in future.

    public class MainActivity extends Activity {
        private Uri mImageCaptureUri;
        private ImageView mImageView;
    
        private static final int PICK_FROM_CAMERA = 1;
        private static final int CROP_FROM_CAMERA = 2;
        private static final int PICK_FROM_FILE = 3;
    
        private String selectedImagePath = "";
        boolean GallaryPhotoSelected = false;
    
        public static String Finalmedia = "";
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.main);
    
            final String[] items = new String[] { "Take from camera",
                    "Select from gallery" };
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.select_dialog_item, items);
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
    
            builder.setTitle("Select Image");
            builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item) { // pick from
                                                                        // camera
                    if (item == 0) {
                        String storageState = Environment.getExternalStorageState();
    
                        if (storageState.equals(Environment.MEDIA_MOUNTED)) {
                            Intent intent = new Intent(
                                    MediaStore.ACTION_IMAGE_CAPTURE);
                            // intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
                            // mImageCaptureUri);
                            // if (hasImageCaptureBug()) {
    
                            String path = Environment.getExternalStorageDirectory()
                                    .getName()
                                    + File.separatorChar
                                    + System.currentTimeMillis() + ".jpg";
                            File file = new File(path);
                            // mImageCaptureUri = Uri.fromFile(new File(
                            // Environment.getExternalStorageDirectory(),
                            // "tmp_avatar_"
                            // + String.valueOf(System
                            // .currentTimeMillis())
                            // + ".jpg"));
                            Log.i("TAG", "Final  path" + path);
                            try {
                                if (file.exists() == false) {
                                    file.getParentFile().mkdirs();
                                    file.createNewFile();
                                }
    
                            } catch (IOException e) {
                                Log.e("TAG", "Could not create file.", e);
                            }
                            mImageCaptureUri = Uri.fromFile(file);
                            intent.putExtra(
                                    android.provider.MediaStore.EXTRA_OUTPUT,
                                    mImageCaptureUri);
                            // } else {
                            // intent.putExtra(
                            // android.provider.MediaStore.EXTRA_OUTPUT,
                            // android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                            // }
    
                            try {
                                // intent.putExtra("return-data", true);
                                startActivityForResult(intent, PICK_FROM_CAMERA);
                            } catch (ActivityNotFoundException e) {
                                e.printStackTrace();
                            }
                        } else {
                            new AlertDialog.Builder(MainActivity.this)
                                    .setMessage(
                                            "External Storeage (SD Card) is required.\n\nCurrent state: "
                                                    + storageState)
                                    .setCancelable(true).create().show();
                        }
    
                    } else { // pick from file
                        Intent intent = new Intent();
    
                        intent.setType("image/*");
                        intent.setAction(Intent.ACTION_GET_CONTENT);
    
                        startActivityForResult(Intent.createChooser(intent,
                                "Complete action using"), PICK_FROM_FILE);
                    }
                }
            });
    
            final AlertDialog dialog = builder.create();
    
            Button button = (Button) findViewById(R.id.btn_crop);
            mImageView = (ImageView) findViewById(R.id.iv_photo);
    
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.show();
                }
            });
        }
    
        public boolean hasImageCaptureBug() {
    
            // list of known devices that have the bug
            ArrayList<String> devices = new ArrayList<String>();
            devices.add("android-devphone1/dream_devphone/dream");
            devices.add("generic/sdk/generic");
            devices.add("vodafone/vfpioneer/sapphire");
            devices.add("tmobile/kila/dream");
            devices.add("verizon/voles/sholes");
            devices.add("google_ion/google_ion/sapphire");
    
            return devices.contains(android.os.Build.BRAND + "/"
                    + android.os.Build.PRODUCT + "/" + android.os.Build.DEVICE);
    
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode != RESULT_OK)
                return;
    
            switch (requestCode) {
            case PICK_FROM_CAMERA:
                Log.i("TAG", "Inside PICK_FROM_CAMERA");
                // mImageCaptureUri = data.getData();
                // Bitmap bm1 = (Bitmap) data.getExtras().get("data");
                // mImageView.setImageBitmap(bm1);
                // Bundle extras1 = data.getExtras();
                // Bitmap bm1 = (Bitmap) extras1.get("data");
                // mImageView.setImageBitmap(bm1);
    
                /*
                 * try { if (hasImageCaptureBug()) { Log.i("TAG", "Inside Bug");
                 * selectedImagePath = String.valueOf(System .currentTimeMillis()) +
                 * ".jpg"; File fi = new File(
                 * Environment.getExternalStorageDirectory(), selectedImagePath);
                 * try { mImageCaptureUri = Uri
                 * .parse(android.provider.MediaStore.Images.Media
                 * .insertImage(getContentResolver(), fi.getAbsolutePath(), null,
                 * null)); if (!fi.delete()) { Log.i("logMarker",
                 * "Failed to delete " + fi); } } catch (FileNotFoundException e) {
                 * e.printStackTrace(); } } else { mImageCaptureUri =
                 * data.getData(); } } catch (Exception e) { Log.i("TAG",
                 * "Inside Bug"); selectedImagePath =
                 * String.valueOf(System.currentTimeMillis()) + ".jpg"; File fi =
                 * new File(Environment.getExternalStorageDirectory(),
                 * selectedImagePath); try { mImageCaptureUri = Uri
                 * .parse(android.provider.MediaStore.Images.Media
                 * .insertImage(getContentResolver(), fi.getAbsolutePath(), null,
                 * null)); if (!fi.delete()) { Log.i("logMarker",
                 * "Failed to delete " + fi); } } catch (FileNotFoundException e1) {
                 * e1.printStackTrace(); } }
                 */
    
                String path = mImageCaptureUri.getPath();
                Log.i("TAG",
                        "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!After capture path "
                                + path);
    
                doCrop();
    
                break;
    
            case PICK_FROM_FILE:
                mImageCaptureUri = data.getData();
                Log.i("TAG",
                        "After Crop mImageCaptureUri " + mImageCaptureUri.getPath());
                GallaryPhotoSelected = true;
                doCrop();
    
                break;
    
            case CROP_FROM_CAMERA:
                Bundle extras = data.getExtras();
    
                selectedImagePath = mImageCaptureUri.getPath();
    
                Log.i("TAG", "After Crop selectedImagePath " + selectedImagePath);
    
                if (GallaryPhotoSelected) {
                    selectedImagePath = getRealPathFromURI(mImageCaptureUri);
                    Log.i("TAG", "Absolute Path " + selectedImagePath);
                    GallaryPhotoSelected = true;
                }
    
                Finalmedia = selectedImagePath;
    
                if (extras != null) {
                    // Bitmap photo = extras.getParcelable("data");
                    Log.i("TAG", "Inside Extra " + selectedImagePath);
                    Bitmap photo = (Bitmap) extras.get("data");
    
                    selectedImagePath = String.valueOf(System.currentTimeMillis())
                            + ".jpg";
    
                    Log.i("TAG", "new selectedImagePath before file "
                            + selectedImagePath);
    
                    File file = new File(Environment.getExternalStorageDirectory(),
                            selectedImagePath);
    
                    try {
                        file.createNewFile();
                        FileOutputStream fos = new FileOutputStream(file);
                        photo.compress(Bitmap.CompressFormat.PNG, 95, fos);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        Toast.makeText(this,
                                "Sorry, Camera Crashed-Please Report as Crash A.",
                                Toast.LENGTH_LONG).show();
                    }
    
                    selectedImagePath = Environment.getExternalStorageDirectory()
                            + "/" + selectedImagePath;
                    Log.i("TAG", "After File Created  " + selectedImagePath);
    
                    Bitmap bm = decodeFile(selectedImagePath);
                    mImageView.setImageBitmap(bm);
                }
    
                /*
                 * File f = new File(mImageCaptureUri.getPath());
                 * 
                 * if (f.exists()) f.delete();
                 */
    
                break;
    
            }
        }
    
        public static Bitmap decodeFile(String path) {
            int orientation;
            try {
                if (path == null) {
                    return null;
                }
                // decode image size
                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                // Find the correct scale value. It should be the power of 2.
                final int REQUIRED_SIZE = 70;
                int width_tmp = o.outWidth, height_tmp = o.outHeight;
                int scale = 1;
                // while (true) {
                // if (width_tmp / 2 < REQUIRED_SIZE
                // || height_tmp / 2 < REQUIRED_SIZE)
                // break;
                // width_tmp /= 2;
                // height_tmp /= 2;
                // scale++;
                // }
                // decode with inSampleSize
                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                Bitmap bm = BitmapFactory.decodeFile(path, o2);
                Bitmap bitmap = bm;
    
                ExifInterface exif = new ExifInterface(path);
    
                orientation = exif
                        .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
    
                Log.e("ExifInteface .........", "rotation =" + orientation);
    
                // exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90);
    
                Log.e("orientation", "" + orientation);
                Matrix m = new Matrix();
    
                if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) {
                    m.postRotate(180);
                    // m.postScale((float) bm.getWidth(), (float) bm.getHeight());
                    // if(m.preRotate(90)){
                    Log.e("in orientation", "" + orientation);
                    bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                            bm.getHeight(), m, true);
                    return bitmap;
                } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
                    m.postRotate(90);
                    Log.e("in orientation", "" + orientation);
                    bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                            bm.getHeight(), m, true);
                    return bitmap;
                } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
                    m.postRotate(270);
                    Log.e("in orientation", "" + orientation);
                    bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                            bm.getHeight(), m, true);
                    return bitmap;
                }
                return bitmap;
            } catch (Exception e) {
                return null;
            }
    
        }
    
        public String getRealPathFromURI(Uri contentUri) {
            String[] proj = { MediaStore.Images.Media.DATA };
            Cursor cursor = managedQuery(contentUri, proj, null, null, null);
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
    
        private void doCrop() {
            final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
    
            Intent intent = new Intent("com.android.camera.action.CROP");
            intent.setType("image/*");
    
            List<ResolveInfo> list = getPackageManager().queryIntentActivities(
                    intent, 0);
    
            int size = list.size();
    
            if (size == 0) {
                Toast.makeText(this, "Can not find image crop app",
                        Toast.LENGTH_SHORT).show();
    
                return;
            } else {
    
                intent.setData(mImageCaptureUri);
                intent.setClassName("com.android.camera",
                        "com.android.camera.CropImage");
                intent.putExtra("outputX", 100);
                intent.putExtra("outputY", 100);
                intent.putExtra("aspectX", 1);
                intent.putExtra("aspectY", 1);
                intent.putExtra("scale", true);
                intent.putExtra("return-data", true);
                // startActivityForResult(intent, CROP_FROM_CAMERA);
    
                if (size == 1) {
                    Intent i = new Intent(intent);
                    ResolveInfo res = list.get(0);
    
                    i.setComponent(new ComponentName(res.activityInfo.packageName,
                            res.activityInfo.name));
    
                    startActivityForResult(i, CROP_FROM_CAMERA);
                } else {
                    for (ResolveInfo res : list) {
                        final CropOption co = new CropOption();
    
                        co.title = getPackageManager().getApplicationLabel(
                                res.activityInfo.applicationInfo);
                        co.icon = getPackageManager().getApplicationIcon(
                                res.activityInfo.applicationInfo);
                        co.appIntent = new Intent(intent);
    
                        co.appIntent
                                .setComponent(new ComponentName(
                                        res.activityInfo.packageName,
                                        res.activityInfo.name));
    
                        cropOptions.add(co);
                    }
    
                    CropOptionAdapter adapter = new CropOptionAdapter(
                            getApplicationContext(), cropOptions);
    
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("Choose Crop App");
                    builder.setAdapter(adapter,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int item) {
                                    startActivityForResult(
                                            cropOptions.get(item).appIntent,
                                            CROP_FROM_CAMERA);
                                }
                            });
    
                    builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
                        @Override
                        public void onCancel(DialogInterface dialog) {
    
                            if (mImageCaptureUri != null) {
                                getContentResolver().delete(mImageCaptureUri, null,
                                        null);
                                mImageCaptureUri = null;
                            }
                        }
                    });
    
                    AlertDialog alert = builder.create();
    
                    alert.show();
                }
            }
        }
    }