I have a HTC Incredible and I'm trying to write a simple application
to take a picture and save it on the SD card.  When I run the tutorial
at http://github.com/commonsguy/cw-advandroid/tree/master/Camera/Picture
it works fine in the emulator.  However, when I try and test it on my
phone I get "The application Picture Demo (process
com.commonsware.android.camera) has stopped unexpectedly.  Please try
again."

I have set the following permissions in the AndroidManifest file.

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


Below is the code I am using.


import android.app.Activity;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;

public class PictureDemo extends Activity {
        private SurfaceView preview=null;
        private SurfaceHolder previewHolder=null;
        private Camera camera=null;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                preview=(SurfaceView)findViewById(R.id.preview);
                previewHolder=preview.getHolder();
                previewHolder.addCallback(surfaceCallback);
                previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }

        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
                if (keyCode==KeyEvent.KEYCODE_CAMERA ||
                                keyCode==KeyEvent.KEYCODE_SEARCH) {
                        takePicture();

                        return(true);
                }

                return(super.onKeyDown(keyCode, event));
        }

        private void takePicture() {
                camera.takePicture(null, null, photoCallback);
        }

        SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
                public void surfaceCreated(SurfaceHolder holder) {
                        camera=Camera.open();

                        try {
                                camera.setPreviewDisplay(previewHolder);
                        }
                        catch (Throwable t) {
                                Log.e("PictureDemo-surfaceCallback",
                                                        "Exception in 
setPreviewDisplay()", t);
                                Toast
                                        .makeText(PictureDemo.this, 
t.getMessage(), Toast.LENGTH_LONG)
                                        .show();
                        }
                }

                public void surfaceChanged(SurfaceHolder holder,
                                                                                
                                         int format, int width,
                                                                                
                                         int height) {
                        Camera.Parameters parameters=camera.getParameters();

                        parameters.setPreviewSize(width, height);
                        parameters.setPictureFormat(PixelFormat.JPEG);

                        camera.setParameters(parameters);
                        camera.startPreview();
                }

                public void surfaceDestroyed(SurfaceHolder holder) {
                        camera.stopPreview();
                        camera.release();
                        camera=null;
                }
        };

        Camera.PictureCallback photoCallback=new Camera.PictureCallback() {
                public void onPictureTaken(byte[] data, Camera camera) {
                        new SavePhotoTask().execute(data);
                        camera.startPreview();
                }
        };

        class SavePhotoTask extends AsyncTask<byte[], String, String> {
                @Override
                protected String doInBackground(byte[]... jpeg) {
                        File photo=new 
File(Environment.getExternalStorageDirectory(),
                                                                                
                        "photo.jpg");

                        if (photo.exists()) {
                                photo.delete();
                        }

                        try {
                                FileOutputStream fos=new 
FileOutputStream(photo.getPath());

                                fos.write(jpeg[0]);
                                fos.close();
                        }
                        catch (java.io.IOException e) {
                                Log.e("PictureDemo", "Exception in 
photoCallback", e);
                        }

                        return(null);
                }
        }
}


-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to