SurfaceView를 통해서 


카메라를 구현하고 버튼을 하나 올렸습니다


그런데 카메라를  한장 찍으면 저장되지도 않고 찍힌 화면에서 그대로 멈춰버리네요 



소스는 안드로이드 API Demo에서 가져왔습니다.


class Preview extends SurfaceView implements SurfaceHolder.Callback {

private static final String TAG = "Preview";


SurfaceHolder mHolder;

public Camera camera;


Preview(Context context) {

super(context);


// Install a SurfaceHolder.Callback so we get notified when the

// underlying surface is created and destroyed.

mHolder = getHolder();

mHolder.addCallback(this);

mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}


public void surfaceCreated(SurfaceHolder holder) {

// The Surface has been created, acquire the camera and tell it where

// to draw.

camera = Camera.open();

try {


camera.setPreviewDisplay(holder);


camera.setPreviewCallback(new PreviewCallback() {


public void onPreviewFrame(byte[] data, Camera arg1) {

FileOutputStream outStream = null;

try {

outStream = new FileOutputStream(String.format(

"/sdcard/%d.jpg", System.currentTimeMillis()));

outStream.write(data);

// outStream.close();

Log.d(TAG, "onPreviewFrame - wrote bytes: "

+ data.length);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (outStream != null) {

try {

outStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}


}

Preview.this.invalidate();

}

});

} catch (IOException e) {

e.printStackTrace();

}

}


public void surfaceDestroyed(SurfaceHolder holder) {

// Surface will be destroyed when we return, so stop the preview.

// Because the CameraDevice object is not a shared resource, it's very

// important to release it when the activity is paused.

camera.stopPreview();

camera.release();

camera = null;

}


public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

// Now that the size is known, set up the camera parameters and begin

// the preview.

Camera.Parameters parameters = camera.getParameters();

parameters.setPreviewSize(w, h);

camera.setParameters(parameters);

camera.startPreview();

}


@Override

public void draw(Canvas canvas) {

super.draw(canvas);

Paint p = new Paint(Color.RED);

Log.d(TAG, "draw");

canvas.drawText("PREVIEW", canvas.getWidth() / 2,

canvas.getHeight() / 2, p);

}

}