Katedral Pillon
Katedral Pillon

Reputation: 14864

custom gallery cropping window in android

After struggling with Camera intents for too long, I have now finally created a custom camera experience for my app by using SurfaceView and the Camera api. It’s pretty awesome as I now have complete control over the picture taking experience. I would like to take control over the gallery experience as well. It’s not clear how I might do that? Any advice? Basically I am hoping for the following user experience

  1. click on gallery button to view photos in your gallery
  2. select a photo from the gallery
  3. the selected photo shows up in a customized preview in which the user can move the photo around to select which portion to use. Notice that this is a sort of cropping that happens within a fixed area (in my case a square the size of the phone's width): no resizing allowed; the area of the picture within the window is the area used. Pretty much most of the social media apps out there do it that way. I just don’t have a clue how they manage that preview/edit-window.

What I know so far:

  1. I can still use the gallery intent to let the user select the image
  2. The part where I am stuck is on how to create the custom edit experience that lets the user choose an area of the image to show (fixed size square). Again, this is not resize-cropping; but rather the user can move the image around to choose which sub-area fits the window.

Thanks for any advice

Upvotes: 1

Views: 933

Answers (1)

BiggDawgg
BiggDawgg

Reputation: 164

Ok Here We Go!

Activity To Select The Image From Gallery.

import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;

public class GalleryUtil extends Activity{
    private final static int RESULT_SELECT_IMAGE = 100;
    public static final int MEDIA_TYPE_IMAGE = 1;
    private static final String TAG = "GalleryUtil";

    String mCurrentPhotoPath;
    File photoFile = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try{
            //Pick Image From Gallery
            Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(i, RESULT_SELECT_IMAGE); 
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch(requestCode){
        case RESULT_SELECT_IMAGE:

            if (resultCode == Activity.RESULT_OK && data != null && data.getData() != null) {
                try{
                Uri selectedImage = data.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA };
                Cursor cursor = getContentResolver().query(selectedImage,
                        filePathColumn, null, null, null);
                cursor.moveToFirst();
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String picturePath = cursor.getString(columnIndex);
                cursor.close();

                //return Image Path to the Main Activity
                Intent returnFromGalleryIntent = new Intent();
                returnFromGalleryIntent.putExtra("picturePath",picturePath);
                setResult(RESULT_OK,returnFromGalleryIntent);     
                finish();
                }catch(Exception e){
                    e.printStackTrace();
                    Intent returnFromGalleryIntent = new Intent();
                    setResult(RESULT_CANCELED, returnFromGalleryIntent);     
                    finish();   
                }
            }else{
                Log.i(TAG,"RESULT_CANCELED");     
                Intent returnFromGalleryIntent = new Intent();
                setResult(RESULT_CANCELED, returnFromGalleryIntent);     
                finish();
            }
            break;
        }
    }
}

Activity To Crop The Selected Image:

public class ImageSelecter extends Activity{

    private final int GALLERY_ACTIVITY_CODE=200;
    private final int RESULT_CROP = 400;

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

        btn_choose.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //Start Activity To Select Image From Gallery   
                Intent gallery_Intent = new Intent(getApplicationContext(), GalleryUtil.class);
                startActivityForResult(gallery_Intent, GALLERY_ACTIVITY_CODE);
                break;
            }
        });

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == GALLERY_ACTIVITY_CODE) {
             if(resultCode == Activity.RESULT_OK){  
                 picturePath = data.getStringExtra("picturePath");  
                 //perform Crop on the Image Selected from Gallery
                 performCrop(picturePath);
             }
        }

        if (requestCode == RESULT_CROP ) {
             if(resultCode == Activity.RESULT_OK){  
                 Bundle extras = data.getExtras();
                 Bitmap selectedBitmap = extras.getParcelable("data");
                 // Set The Bitmap Data To ImageView
                 image_capture1.setImageBitmap(selectedBitmap);                             
                 image_capture1.setScaleType(ScaleType.FIT_XY);
             }
        }
    }

    private void performCrop(String picUri) {
        try {
            //Start Crop Activity

            Intent cropIntent = new Intent("com.android.camera.action.CROP");
            // indicate image type and Uri
            File f = new File(picUri);
            Uri contentUri = Uri.fromFile(f);

            cropIntent.setDataAndType(contentUri, "image/*");
            // set crop properties
            cropIntent.putExtra("crop", "true");
            // indicate aspect of desired crop
            cropIntent.putExtra("aspectX", 1);
            cropIntent.putExtra("aspectY", 1);
            // indicate output X and Y
            cropIntent.putExtra("outputX", 280);
            cropIntent.putExtra("outputY", 280);

            // retrieve data on return
            cropIntent.putExtra("return-data", true);
            // start the activity - we handle returning in onActivityResult
            startActivityForResult(cropIntent, RESULT_CROP);
        }
        // respond to users whose devices do not support the crop action
        catch (ActivityNotFoundException anfe) {
            // display an error message
            String errorMessage = "your device doesn't support the crop action!";
            Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
            toast.show();
        }
    }   

This all hope this will give you a head up:)

Upvotes: 1

Related Questions