camera preview is not restarting?

android, android-camera, android-intent

Solution

The article about Camera from Android API Guide also suffers from the same problem. I could get the preview back after taking pictures by adding two more stuff like following:

1) Add external storage permission in the `AndroidManifest.xml` file:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2) Start preview again by calling `camera.startPreview()`. In your code:

...
Log.d(TAG, "onPictureTaken - jpeg");
camera.startPreview();
....

I'm sure you'll be able to get yours to work in the same way.

Problem

I am working on the camera code in android to take picture and save it on the phone. It takes the picture from phone camera and saves it on the memory card. The only problem is that the camera preview does not restart after taking the picture. I cannot figure out the solution. Code is as follows. Suggestions are needed . . . There are two classes in my project . . . CAMERAACTIVITY CLASS ``` public class CameraActivity extends Activity { private static final String TAG = "CameraDemo"; Preview preview; Button buttonClick; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); preview = new Preview(this); ((FrameLayout) findViewById(R.id.preview)).addView(preview); buttonClick = (Button) findViewById(R.id.buttonClick); buttonClick.setOnClickListener(new OnClickListener() { public void onClick(View v) { preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); } }); Log.d(TAG, "onCreate'd"); } // Called when shutter is opened ShutterCallback shutterCallback = new ShutterCallback() { public void onShutter() { Log.d(TAG, "onShutter'd"); } }; // Handles data for raw picture PictureCallback rawCallback = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { Log.d(TAG, "onPictureTaken - raw"); } }; // Handles data for jpeg picture PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { FileOutputStream outStream = null; try { // Write to SD Card outStream = new FileOutputStream(String.format("/sdcard/DCIM/queries.jpg", System.currentTimeMillis())); outStream.write(data); outStream.close(); Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } Log.d(TAG, "onPictureTaken - jpeg"); } }; } ``` Preview Class ``` class Preview extends SurfaceView implements SurfaceHolder.Callback{ private static final String TAG = "Preview"; SurfaceHolder mHolder; // <2> public Camera camera; // <3> Preview(Context context) { super(context); // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); // <4> mHolder.addCallback(this); // <5> mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // <6> } // Called once the holder is ready public void surfaceCreated(SurfaceHolder holder) { // <7> // The Surface has been created, acquire the camera and tell it where // to draw. camera = Camera.open(); // <8> try { Camera.Parameters parameters = camera.getParameters(); parameters.set("orientation", "landscape"); camera.setParameters(parameters); camera.setPreviewDisplay(holder); camera.setPreviewCallback(new PreviewCallback() { // Called for each frame previewed public void onPreviewFrame(byte[] data, Camera camera) { Log.d(TAG, "onPreviewFrame called at: " + System.currentTimeMillis()); Preview.this.invalidate(); } }); } catch (IOException e) { e.printStackTrace(); } } // Called when the holder is destroyed public void surfaceDestroyed(SurfaceHolder holder) { //Log.d(TAG,"Stopping preview in SurfaceDestroyed()."); camera.setPreviewCallback(null); camera.stopPreview(); camera.release(); camera = null; } // Called when holder has changed public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { camera.startPreview(); } } ```

Original source