Android应用打开后相机预览立即卡顿冻结。

3
在我正在开发的应用程序中,我使用了一个教程来使用相机,但是当应用程序打开后,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();
}
1个回答

1
如果您所描述的行为是这样的,请考虑一下...有一个生命周期,使您的应用程序正常工作。
因此,请检查您在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以获取更多信息


我尝试了,但应用程序崩溃并显示无法打开相机。 - Myrium
您是否是指将该代码从onResume方法中移除并放置到onCreate方法中? - Myrium
你必须保留 onResume 不变,并修改 Camera 初始化以进行非崩溃调用预览...请检查我的更新... - Jordi Castilla
我尝试了,但仍然崩溃,它给了我以下信息: 进程:com.example.guilhermecardoso.omgandroid,PID:28969 java.lang.RuntimeException: 无法连接到相机服务 - Myrium
1
非常感谢您的帮助。我尝试使用教程,但仍然存在同样的问题,应用程序在第一次打开后就会冻结,但即使我改变设备的方向,它也会正常运行。 - Myrium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接