Android: Camera and Image Gallery

Posted by Tiago Scolari on Oct 10, 2011
In Development, Android
Tags

Here is some simple steps to access the phone camera and image gallery. This will be a very simple app. There is only one view, it will hold 2 buttons for selecting the image (one from camera and another from the gallery) and a ImageView that will show the selected image. I’ll not talk about the layout here, what I did is ugly and looks like this:

First of all, the app needs permission to do this:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

On the activity, define 2 constants to hold the requestCode (values of your choice, must be unique request codes within this activty):

private static final int IMAGE_PICK     = 1;
private static final int IMAGE_CAPTURE  = 2;

I created 2 OnClickListener classes and bound each one to a button:

/**
 * Click Listener for selecting image from phone gallery
 */
class ImagePickListener implements OnClickListener {
  @Override
  public void onClick(View v) {
    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    intent.setType("image/*");
    startActivityForResult(Intent.createChooser(intent, "Escolha uma Foto"), IMAGE_PICK);
  }
}

/**
 * Click listener for taking a new picture
 */
class TakePictureListener implements OnClickListener {
  @Override
  public void onClick(View v) {
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent, IMAGE_CAPTURE);
  }
}

To bind these Listeners, select each button and use the setOnClicsetOnClickListener. The request code, that we sent to startActivityForResult, will be fetch on the onActivityResult method:

/**
 * Receive the result from the startActivity
 */
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  if (resultCode == Activity.RESULT_OK) {
    switch (requestCode) {
      case IMAGE_PICK:
        this.imageFromGallery(resultCode, data);
        break;
      case IMAGE_CAPTURE:
        this.imageFromCamera(resultCode, data);
        break;
      default:
        break;
    }
  }
}

And, finally, fetch each data and set it as the ImageView image of the view:

/**
 * Image result from camera
 * @param resultCode
 * @param data
 */
private void imageFromCamera(int resultCode, Intent data) {
  this.imageView.setImageBitmap((Bitmap) data.getExtras().get("data"));
}

/**
 * Image result from gallery
 * @param resultCode
 * @param data
 */
private void imageFromGallery(int resultCode, Intent data) {
  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 filePath = cursor.getString(columnIndex);
  cursor.close();

  this.imageView.setImageBitmap(BitmapFactory.decodeFile(filePath));
}

I created this app for testing image processing, there is a github repo with my tests. I created a tag (blog-post) to date this post, where things were working, at least =p