屏幕锁定后,相机预览会冻结

Hen*_*ger 20 java camera android android-activity

我写的自定义相机应用程序停止在屏幕锁定后进行预览(通过按下锁定按钮或等待几分钟).我没有得到例外,这使得很难找到问题.

Android屏幕锁定(如果这是正确的术语)暂停/暂停/ ...我的应用程序(活动)?

如果是这种情况,原因可能是我的onPause/onResume方法吗?或者可能是另一个原因吗?

提前致谢

cod*_*ood 31

我遇到了同样的问题,并使用以下步骤修复它:

  1. 我创建了我的相机预览,并将其添加到父活动的onResume()容器FrameLayout中.就像是:

    public void onResume{
        super.onResume();
        mCamera = Camera.open();
        if(null != mCamera){
            mCamera.setDisplayOrientation(90);
            mPreview = new CameraOverlay(getActivity(), mCamera);
            frLyParent.addView(mPreview);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我删除了onPause()中的视图.这解决了冻结问题.

    public void onPause(){
        super.onPause();
        if(null != mCamera){
            mCamera.release();
            mCamera = null;
        }
        frLyParent.removeView(mPreview);
        mPreview = null;
    }
    
    Run Code Online (Sandbox Code Playgroud)

其中CameraOverlay()是扩展SurfaceView并实现SurfaceHolder.Callback的类.如果您需要实施,请告诉我.

  • 你是个天才!谢谢!我没有使用frLyParen.removeView(mPreview),这是基础! (3认同)
  • @LuigiTiburzi我也是,我已经找了差不多2天,直到我发现这行'frLyParen.removeView(mPreview)`:) (3认同)
  • @SimonT我的实现基于[Google的建议](http://developer.android.com/guide/topics/media/camera.html),但在`preview.addView(mPreview)之前添加了`preview.removeView(mPreview)` `在`onCreate`.我认为旧视图一直存在,导致预览的外观被冻结(即使我确实从相机中获取了帧). (2认同)

Afr*_*din 7

这是我的,它确实有效:-)

@Override
    public void onResume() {
        super.onResume();
        try {
            camera = Camera.open();
            holder.addCallback(this);
            surface.setVisibility(View.VISIBLE);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onPause() {
        try {
            surface.setVisibility(View.GONE);
            holder.removeCallback(this);
            camera.release();
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onPause();
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

onResume()方法中添加这一行:

surfaceView.setVisibility(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)

onPaused()方法中添加这一行:

surfaceView.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

  • 这应该是正确答案,因为它解决了问题。 (2认同)