Jithin Varghese
Jithin Varghese

Reputation: 2228

how to get filename and path of saved image after cropping

I have an app with image cropping option. After cropping the actual image, the cropped image is saved in gallery. My question is how to retrieve the file name and path of the cropped image saved in gallery.

my code is,

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();

            doCrop();

            break;          

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

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

                mImageView.setImageBitmap(photo);
            }

            File f = new File(mImageCaptureUri.getPath());            

            if (f.exists()) f.delete();

            break;

    }
}

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();
        }
    }
}

I have tried a lot but not retrieving the file name and path. Is there any solution.

Upvotes: 0

Views: 3308

Answers (1)

NecipAllef
NecipAllef

Reputation: 506

You are using startActivityForResult(), but do you override onActivityResult()? In your case you need to do the following:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
   if (requestCode == PICK_FROM_FILE && resultCode == RESULT_OK)
   { 
      Uri pictureUri = data.getData();
   }
}

This code gets the Uri of the picture. Then you can use this Uri to get the path, using a method like below:

private String getRealPathFromURI(Context context, Uri contentUri)
{
    Cursor cursor = null;
    try
    {
        String[] proj = {MediaStore.Images.Media.DATA};
        cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally
    {
        if (cursor != null)
        {
            cursor.close();
        }
    }
}

EDIT

After you crop the Bitmap and ready to go, you can save it with something like this:

private Uri saveOutput(Bitmap croppedImage)    
{
    Uri saveUri = null;
    // Saves the image in cache, you may want to modify this to save it to Gallery
    File file = new File(getCacheDir(), "cropped");
    OutputStream outputStream = null;
    try
    {
        file.getParentFile().mkdirs();
        saveUri = Uri.fromFile(file);
        outputStream = getContentResolver().openOutputStream(saveUri);
        if (outputStream != null)
        {
            croppedImage.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
        }
    } catch (IOException e)
    {
        // log the error
    }

    return saveUri;
}

After getting the Uri, you can get path to cropped image with the same method above.

Upvotes: 2

Related Questions