简体   繁体   English

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

[英]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. 在我正在开发的应用程序中,我使用了一个教程来使用相机,但是当应用程序打开时,在1或2秒后,预览会冻结。 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();
}

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... 因此,检查onPauseonResume方法中的内容,使您的Camera预览工作正常...

If I have to bet, i will say: 如果我必须下注,我会说:

camera = Camera.open();

must be in onCreate() . 必须在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 请查看此链接以获取更多信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM