Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Camera Preview Freezing Right After App Open

in the app i'm developing, i used a tutorial to use the camera, but when the app opens, after 1 or 2 seconds, the preview freezes. The thing is: if i press home and after go back for the app, it works normally.

Here my code:

  private SurfaceView preview=null;
private SurfaceHolder previewHolder=null;
private Camera camera=null;
private boolean inPreview=false;
private boolean cameraConfigured=false

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    preview=(SurfaceView)findViewById(R.id.preview);
    previewHolder = preview.getHolder();
    previewHolder.addCallback(surfaceCallback);
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

private void startPreview() {
    if (cameraConfigured && camera!=null) {

        camera.setDisplayOrientation(90);
        camera.startPreview();
        inPreview=true;
    }
}

private Camera.Size getBestPreviewSize(int width, int height,
                                       Camera.Parameters parameters) {
    Camera.Size result=null;

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
        if (size.width<=width && size.height<=height) {
            if (result == null) {
                result = size;
            } else {
                int resultArea = result.width * result.height;
                int newArea = size.width * size.height;

                if (newArea > resultArea) {
                    result = size;
                }
            }
        }
    }
    camera.setDisplayOrientation(90);
    return(result);
}

private void initPreview(int width, int height) {
    if (camera!=null && previewHolder.getSurface()!=null) {
        try {
            camera.setPreviewDisplay(previewHolder);
        }
        catch (Throwable t) {
            Log.e("Preview-surfaceCallback",
                    "Exception in setPreviewDisplay()", t);
            Toast
                    .makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_LONG)
                    .show();
        }

        if (!cameraConfigured) {
            Camera.Parameters parameters=camera.getParameters();
            Camera.Size size=getBestPreviewSize(width, height,
                    parameters);

            if (size!=null) {
                parameters.setPreviewSize(size.width, size.height);
                camera.setParameters(parameters);
                cameraConfigured=true;
            }
        }
    }
}

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
    public void surfaceCreated(SurfaceHolder holder) {
        // no-op -- wait until surfaceChanged()

    }

    public void surfaceChanged(SurfaceHolder holder,
                               int format, int width,
                               int height) {
        initPreview(width, height);
        startPreview();

    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // no-op
    }
};


protected void onPause() {
    if (inPreview) {
        camera.stopPreview();
    }

    camera.release();
    camera=null;
    inPreview=false;
    super.onPause();
}

protected void onResume() {
    super.onResume();
    camera = Camera.open();
    startPreview();
}
like image 850
Myrium Avatar asked Mar 17 '26 14:03

Myrium


1 Answers

If the behaviour is what you explain think about... there is a lifecycle that makes your app work.

So, check what you have in your onPause and onResume methods that makes your Camera preview work nice...

If I have to bet, i will say:

camera = Camera.open();

must be in onCreate().

UPDATE try this:

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

    public void surfaceChanged(SurfaceHolder holder,
                               int format, int width,
                               int height) {
        initPreview(width, height);
        startPreview();

    }
}

Check this link for more info

like image 174
Jordi Castilla Avatar answered Mar 19 '26 04:03

Jordi Castilla



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!