0

My code:

public void onClick(View v)
{
    if(getCamera() != null && CameraPreview.SAFE_TO_TAKE_PICTURE)
    {
        getCamera().startPreview();
        getCamera().takePicture(null, null, mJpegImageCallback);
    }
}

private PictureCallback mJpegImageCallback = new PictureCallback()
{
    public void onPictureTaken(byte[] data, Camera camera)
    {
        CameraPreview.SAFE_TO_TAKE_PICTURE = false;
        onCameraPictureTaken(data);
        BBLogUtils.logFlow("Camera: Image Taken");
    }
};

CameraPreview:

public void surfaceCreated(SurfaceHolder holder)
{
    // The Surface has been created, acquire the camera and tell it where
    // to draw.
    mCamera = Camera.open(0);
    mParameters = mCamera.getParameters();
    setCameraDisplayOrientation();
    mCamera.setPreviewDisplay(holder);
    if ( isAutoFocusSupported() )
        setFocus();
    if ( isFlashSupported() )
        setFlash(mFlashState);
}

public void surfaceDestroyed(SurfaceHolder holder)
{
    if ( mCamera != null )
    {
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    mPreviewWidth = width;
    mPreviewHeight = height;
    Camera.Size previewSize = getBestPreviewSize(width, height);
    Camera.Size pictureSize = getOptimalImageSize();
    holder.setFormat(format);
    mParameters.setPreviewSize(previewSize.width, previewSize.height);
    mParameters.setPictureSize(pictureSize.width, pictureSize.height);
    mParameters.setJpegQuality(100);
    mCamera.setPreviewDisplay(holder);
    SAFE_TO_TAKE_PICTURE = true;
    setCameraParameters();
    handleFocus();
}

private void setCameraParameters()
{
    mCamera.stopPreview();
    mCamera.setParameters(mParameters);
    mCamera.startPreview();
}

I read somewhere that you need to set safe_to_take_picture needs to be checked before taking picture, so that it's ensured that preview has started before takepicture is called. I'm even doing that explicitly. Even then am getting the following exception:

java.lang.RuntimeException: takePicture failed
E/ACRA    ( 1180):  at android.hardware.Camera.native_takePicture(Native Method)
E/ACRA    ( 1180):  at android.hardware.Camera.takePicture(Camera.java:1100)
E/ACRA    ( 1180):  at android.hardware.Camera.takePicture(Camera.java:1045)
E/ACRA    ( 1180):  at CameraClickListener.onClick(CameraClickListener.java:38)
E/ACRA    ( 1180):  at CameraActivity$7.onClick(CameraActivity.java:200)
E/ACRA    ( 1180):  at android.view.View.performClick(View.java:4240)
E/ACRA    ( 1180):  at android.view.View$PerformClick.run(View.java:17721)
E/ACRA    ( 1180):  at android.os.Handler.handleCallback(Handler.java:730)
E/ACRA    ( 1180):  at android.os.Handler.dispatchMessage(Handler.java:92)
E/ACRA    ( 1180):  at android.os.Looper.loop(Looper.java:137)
Prateek
  • 1,062
  • 1
  • 10
  • 27
  • follow this link:http://stackoverflow.com/questions/21723557/java-lang-runtimeexception-takepicture-failed – prakash Sep 10 '14 at 07:18
  • In `surfaceChanged()`, just set the flag `CameraPreview.SAFE_TO_TAKE_PICTURE= true;` to true after calling `startPreview()` – Sagar Pilkhwal Sep 10 '14 at 07:19
  • Have done that. Somehow that code got removed while posting here. See the code now. It fails even when this variable is being set in surfaceChanged. – Prateek Sep 10 '14 at 07:36

0 Answers0