【问题标题】:Android Camera Preview Freezing Right After App OpenAndroid相机预览在应用打开后立即冻结
【发布时间】:2015-07-21 11:44:50
【问题描述】:

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

这是我的代码:

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

【问题讨论】:

    标签: java android android-camera


    【解决方案1】:

    如果行为是您所解释的所想...有一个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了解更多信息

    【讨论】:

    • 我试过了,但应用程序崩溃并说无法打开相机。
    • 或者你的意思是从onResume中取出并放入onCreate函数?
    • 您必须保持onResume 原样并修改Camera 初始化以进行非崩溃调用以预览...。检查我的更新...
    • 我试过了,但仍然崩溃,它给了我Process: com.example.guilhermecardoso.omgandroid, PID: 28969 java.lang.RuntimeException: Fail to connect to camera service
    • 非常感谢您的帮助。我尝试使用教程,但仍然出现同样的问题,应用程序第一次打开后它立即冻结,但即使我改变设备的方向,它也能正常恢复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多