2

I'm following this tutorial: http://mobile.tutsplus.com/tutorials/android/capture-and-crop-an-image-with-the-device-camera/

I am trying to create a simple activity that has a "take picture" Button, and an ImageView, and simply take a picture, then open the cropping activity built into Android. I can open the camera without incident, however, upon taking the photo, the code doesn't send the photo to the cropping activity.

It seems to crash when the cropping activity is called. I'm not sure why this is occurring; I followed the example exactly (except for the beginning XML stuff which I didn't need), and I looked over the code and everything seems to make sense. I'm sure it's a minor error somewhere that is causing this. Here is my code for the activity:

package com.example.project;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class ImageChoose extends Activity implements OnClickListener {

//keep track of camera capture intent
final int CAMERA_CAPTURE = 1;
//captured picture uri
private Uri picUri;
final int PIC_CROP = 2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_image_choose);
    Button takePicture = (Button)findViewById(R.id.takePicture);
    takePicture.setOnClickListener(this);
}

public void onClick(View v) {
    if (v.getId() == R.id.takePicture){
        try{
            //use standard intent to capture an image
            Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            //we will handle the returned data in onActivityResult
            startActivityForResult(captureIntent, CAMERA_CAPTURE);
        }catch(ActivityNotFoundException anfe){
            //display an error message
            String errorMessage = "Your device doesn't support photos!";
            Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
            toast.show();
        }
    }

}

protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if (resultCode == RESULT_OK){
        if (requestCode == CAMERA_CAPTURE){
            picUri = data.getData();
            performCrop();
        }else if(requestCode == PIC_CROP){
            //get the returned data
            Bundle extras = data.getExtras();
            //get the cropped bitmap
            Bitmap thePic = extras.getParcelable("data");
            //retrieve a reference to the ImageView
            ImageView picView = (ImageView)findViewById(R.id.picture);
            //display the returned cropped image
            picView.setImageBitmap(thePic);
        }
    }
}

private void performCrop(){
    try{
        //call the standard crop action intent (the user device may not support it)
        Intent cropIntent = new Intent("com.android.camera.action.CROP");
            //indicate image type and Uri
        cropIntent.setDataAndType(picUri, "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", 256);
        cropIntent.putExtra("outputY", 256);
            //retrieve data on return
        cropIntent.putExtra("return-data", true);
            //start the activity - we handle returning in onActivityResult
        startActivityForResult(cropIntent, PIC_CROP);
    }catch(ActivityNotFoundException anfe){
        String errorMessage = "Your device doesn't support photo cropping!";
        Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
        toast.show();
    }
  }

  }
Neha Shukla
  • 3,572
  • 5
  • 38
  • 69
gratsby
  • 3,107
  • 4
  • 20
  • 20

3 Answers3

7

I have used this type of action.Here is my code with the following link:-Detail Description

I hope this will help you.I suggest you the following Lines where you should have your focus:-

Intent camera=new Intent();
camera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
camera.putExtra("crop", "true");
Community
  • 1
  • 1
Hardik Vora
  • 414
  • 2
  • 9
0

The cropping activity is part of the stock Android camera app. It may or may not be available on your device, especially if you are using a custom/vendor camera app. If you want this to work reliably, you have to take the code for the cropper and incorporate it into your own app.

Nikolay Elenkov
  • 52,576
  • 10
  • 84
  • 84
-1
private void performCrop(){
}
Inside this method we are going to call an Intent to perform the crop, so let’s add “try” and “catch” blocks in case the user device does not support the crop operation:

try {
}
catch(ActivityNotFoundException anfe){
    //display an error message
    String errorMessage = "Whoops - your device doesn't support the crop action!";
    Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
    toast.show();
}

    //call the standard crop action intent (the user device may not support it)
Intent cropIntent = new Intent("com.android.camera.action.CROP");
    //indicate image type and Uri
cropIntent.setDataAndType(picUri, "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", 256);
cropIntent.putExtra("outputY", 256);
    //retrieve data on return
cropIntent.putExtra("return-data", true);
    //start the activity - we handle returning in onActivityResult
startActivityForResult(cropIntent, PIC_CROP);

//keep track of cropping intent
final int PIC_CROP = 2;
Nipun Gogia
  • 1,846
  • 1
  • 11
  • 17