Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

camera preview is not restarting?

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();
  }

}
like image 856
user1388142 Avatar asked Dec 08 '22 23:12

user1388142


1 Answers

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.

like image 180
Jindor Avatar answered Jan 01 '23 15:01

Jindor