【问题标题】:How to recover camera preview from sleep?如何从睡眠中恢复相机预览?
【发布时间】:2011-06-29 10:24:49
【问题描述】:

我有一个显示相机预览的应用程序,我希望用户能够让手机进入睡眠状态然后唤醒它,以便我的应用程序能够正确恢复。问题是当从睡眠中返回时,相机预览不会重新启动。

我已经实现了 api 演示中介绍的相机预览,但似乎 api 演示示例仅靠运气才能工作。在示例中,屏幕方向被强制为横向,这意味着每次手机进入睡眠状态时手机都会进行配置更改,因为锁屏处于纵向模式。如果在相机预览应用程序(如我的应用程序)中使用纵向模式,错误就会浮出水面。

我已经收集到该错误与表面视图的重新创建有关。进入 onPause 时应该始终销毁表面,然后在 onResume 之后重新创建表面,但进入睡眠时不会发生这种情况。看来我必须销毁整个活动,然后重新创建它才能让相机预览再次工作。我希望能够重新创建表面视图。

除了重新创建整个活动之外,还有其他方法可以强制重新创建表面视图吗?

【问题讨论】:

    标签: android camera preview


    【解决方案1】:

    一种解决方案可能是在 onResume() 中将surfaceview 设置为不可见和可见,这会使surfaceview 销毁并重新创建。

    【讨论】:

    • +1 谢谢,确实有帮助!但是:在相机实现中,我还必须传递我拍摄并保存的图像的文件 Uri,而不是将原始字节数组传递回调用相机的活动,因为尝试传递字节数组会导致绑定器失败睡眠后的交易。
    • Jason 的解决方案适用于我的 4.0 及更高版本的设备,但我的 3.0 及更低版本的设备仍然表现出相同的症状。有什么建议吗?
    【解决方案2】:

    我遇到了同样的问题,原因如下:

    onPause 方法不会回收我制作的 CameraPreview 类(实现了 SurfaceView 回调)。我没有尝试重新实例化整个对象本身,而只是更新了我传递给它的相机对象引用

    null
    

    cameraPreview.setCamera(mCamera);
    

    我调用了一个 getCameraInstance 方法来重新初始化相机,然后将它传递给 preivew 对象。

    现在问题来了:

    private void initializeCameraView(){
    
        RelativeLayout preview = (RelativeLayout)rootView.findViewById(R.id.camera_preview);
    
        preview.addView(cameraPreview);
    }
    

    在onResume中,我调用了这个方法来重新初始化cameraPreview对象。 但是,因为我试图将另一个 cameraPreview 添加到预览视图中,所以它冻结了。这是我的解决方法,简单明了。如果它已经存在,请将其删除,然后重新放入。希望这会有所帮助!

    private void initializeCameraView(){
    
        RelativeLayout preview = (RelativeLayout)rootView.findViewById(R.id.camera_preview);
        //removes the problem with the camera freezing onResume
        if(cameraPreview != null) {
            preview.removeView(cameraPreview);
        }
        preview.addView(cameraPreview);
    }
    

    【讨论】:

    • 伙计,这是困扰我 3 天无法入睡的问题的答案:D 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2011-05-04
    • 2022-01-13
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2020-09-02
    相关资源
    最近更新 更多