android-camera之Android 摄像头和 SurfaceView : Correct way to release

jpfss 阅读:134 2025-02-15 21:57:57 评论:0

我想知道编写 SurfaceView 的 surfaceDestroyed 方法和 surfaceCreated 方法以及使用相机的 Activity 的 onPause 和 onResume 方法的最佳实践是什么?有几个帖子,但似乎没有一个有帮助。

代码如下:

表面创建

public void surfaceCreated(SurfaceHolder holder) { 
    try { 
        Log.d(TAG,"Surface Created"); 
        mCamera.setPreviewDisplay(holder); 
        mCamera.startPreview(); 
    } catch (IOException e) { 
        Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
    } 
} 

表面破坏

public void surfaceDestroyed(SurfaceHolder holder) { 
    this.getHolder().removeCallback(this); 
    mCamera.stopPreview(); 
    mCamera.release(); 
} 

恢复时的事件

protected void onResume() { 
    super.onResume(); 
    mCamera.setPreviewCallback(null); 
    Log.d(TAG,"onResume Called"); 
    if (mCamera==null){ 
    mCamera=getCameraInstance(); 
    } 
    initializeCamera(mCamera);       
} 

事件暂停

protected void onPause() { 
    super.onPause(); 
    Log.d(TAG,"onPause Called"); 
    if(mCamera!=null){ 
        mCamera.stopPreview(); 
        mCamera.setPreviewCallback(null); 
        mPreview.getHolder().removeCallback(mPreview); 
        preview.removeView(mPreview); 
        mCamera.release(); 
        mCamera = null; 
    } 
} 

在 initializeCamera 中,我执行以下操作:

private void initializeCamera(Camera mCamera) { 
    mPreview = new InternalCameraPreview(this, mCamera); 
    preview = (FrameLayout) findViewById(R.id.camera_preview); 
    preview.addView(mPreview); 
 
} 

使用此设置,我在运行应用程序时收到错误消息 Method Called Before Release()。我哪里错了?

请您参考如下方法:

应该是这样的:

@Override 
    public void onPause() { 
        super.onPause(); 
 
        if (mCamera != null){ 
            //              mCamera.setPreviewCallback(null); 
            mPreview.getHolder().removeCallback(mPreview); 
            releaseMediaRecorder(); 
            mCamera.release();        // release the camera for other applications 
            mCamera = null; 
 
        } 
    } 
 
    @Override 
    public void onResume() { 
        super.onResume(); 
        if (mCamera == null) { 
            mCamera=getCameraInstance(); 
            mPreview = new CameraPreview(this.getActivity(), mCamera); 
            preview.addView(mPreview); 
        } 
    } 

surfaceDestroyed 中不需要任何东西


标签:Android
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号