Android 应用程序打开后相机预览立即冻结

Android Camera Preview Freezing Right After App Open

在我正在开发的应用程序中,我使用了一个教程来使用相机,但是当应用程序打开时,在 1 或 2 秒后,预览冻结。问题是:如果我按主页,然后返回应用程序,它会正常工作。

这是我的代码:

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

如果行为如您所解释的那样……有一个 lifecycle 让您的应用正常工作。

所以,请检查您的 onPauseonResume 方法中有什么可以让您的相机预览工作正常...

如果一定要赌,我会说:

camera = Camera.open();

必须在 onCreate().

更新试试这个:

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

    }
}

查看this link了解更多信息