【问题标题】:Camera preview freezes after screen lock屏幕锁定后相机预览冻结
【发布时间】:2013-04-30 01:32:03
【问题描述】:

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

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

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

提前致谢

【问题讨论】:

  • 是的,您需要在onPause 中停止camer preview 并在onResume 中恢复它

标签: java android android-activity camera


【解决方案1】:

我遇到了同样的问题并使用以下步骤解决了它:

  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);
        }
    }
    
  2. 我删除了 onPause() 中的视图。这修复了冻结。

    public void onPause(){
        super.onPause();
        if(null != mCamera){
            mCamera.release();
            mCamera = null;
        }
        frLyParent.removeView(mPreview);
        mPreview = null;
    }
    

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

【讨论】:

  • 嗨 itsviks 。您能否更新您在第 2 步中尝试写的内容。谢谢。
  • 你是个天才!谢谢!我没有使用 frLyParen.removeView(mPreview),这是根本!
  • @LuigiTiburzi 我也是,我已经搜索了将近 2 天,直到找到这条线 frLyParen.removeView(mPreview) :)
  • 我希望它发布后不会太久,但是有人可以发送确切的实现是什么吗?我已经为此苦苦挣扎了 12 个小时!
  • @SimonT 我的实现基于Google's suggestion,但在onCreate 中的preview.addView(mPreview) 之前添加了preview.removeView(mPreview)。我认为旧视图一直存在并导致预览的外观被冻结(即使我确实从相机中获取了帧)。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    surfaceView.setVisibility(View.VISIBLE);
    

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

    surfaceView.setVisibility(View.GONE);
    

    【讨论】:

    • 这应该是正确的答案,因为它解决了问题。
    • 我已经 +1 了,但不是我提出问题。
    【解决方案4】:

    谢谢,我对此进行了修改,它也适用于我

    在打开相机之前,我在onpause() 中添加了mPreview.removeView(mPreview.mSurfaceView);,在onResume() 中添加了mPreview.addView(mPreview.mSurfaceView);

    我还在预览课中删除了addView(mSurfaceView);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多