tags:

views:

563

answers:

2

I'm creating an Android application which uses user captured images as part of a larger process. So far my XML layout has a SurfaceView and Button inside a RelativeLayout. I've managed to get the camera preview to show on the SurfaceView but I'm stuck on how to take a picture and save it when a user presses the button.

My class file looks something like the CameraPreview API demo: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

Ideally, when the button it pressed the camera should autofocus, snap a picture (with the clicky sound), save it to /data/data/app_package_structure/files/file_name.jpg, then pop up a Toast to tell the user their image has been saved.

Any help is much appreciated :)

+4  A: 

Here is a sample application that handles the take-a-picture-and-save-it part. Auto-focus, clicky, Toast, and saving to the app-local file store vs. the SD card are left as exercises for the student. :-)

CommonsWare
Thanks for that sameple (which I've already seen before) but I'm really looking for a more complete answer to my question.
greenie
With ketchup or mayo?
Lo'oris
+3  A: 

I think CommonsWare has really already answered most of this question, but this might work for the auto focus and the shutter sound. This is a guess, since I'm not at a machine where I can compile/test any of this.

In your button-press-handling code, I believe you should call (possibly by message passing)

camera.autoFocus(new Camera.AutoFocusCallback() {
  Camera.ShutterCallback shutterCallback = new Camera.ShutterCallback() {
    public void onShutter() {
      // Play your sound here.
    }
  };
  public void onAutoFocus(boolean success, Camera camera) {
    camera.takePicture(shutterCallback, null, photoCallback);
  }
});  

where camera is your camera object, and photoCallback is the same as in CommonsWare's example.

Exactly what is it that you are stuck on?

Oh, and don't forget to add the <uses-feature> tag android.hardware.camera.autofocus. :)

Mikael Ohlson
This is excellent help. My autofocus is working great now. I've just got one hurdle to get over, saving the picture. What is returned by takePicture(), what do I do with it in photoCallback and how do I save that result as an image?
greenie
Well, my guess is that `takePicture` returns nothing, instead the picture is passed as a JPEG format byte-array to photoCallback via its `onPictureTaken(byte[] data, Camera camera)` callback method. You probably only have to write those bytes straight to file.
Mikael Ohlson
At least that was my impression from http://developer.android.com/reference/android/hardware/Camera.PictureCallback.html and http://developer.android.com/reference/android/hardware/Camera.html#takePicture%28android.hardware.Camera.ShutterCallback,%20android.hardware.Camera.PictureCallback,%20android.hardware.Camera.PictureCallback%29
Mikael Ohlson
The shutter sound should be in the shutterCallback that's passed into takePicture. Thanks for the tip Mikael!
just_another_coder
You're welcome. :-)
Mikael Ohlson