Android 如何从睡眠中恢复相机预览?

Android 如何从睡眠中恢复相机预览?,android,camera,preview,Android,Camera,Preview,我有一个显示摄像头预览的应用程序,我希望用户能够将手机置于睡眠状态,然后将其唤醒,以便我的应用程序能够正确恢复。问题是,当从睡眠状态返回时,相机预览不会重新启动 我已经实现了api演示中介绍的摄像头预览,但似乎api演示示例只能靠运气工作。在本例中,屏幕方向强制为横向,这意味着手机将在每次进入睡眠状态时进行配置更改,因为锁屏处于纵向模式。如果在相机预览应用程序中使用纵向模式(如在我的应用程序中),则会出现错误 据我推测,这只虫子与surfaceview的娱乐活动有关。在进入onPause时应始终

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

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

据我推测,这只虫子与surfaceview的娱乐活动有关。在进入onPause时应始终销毁曲面,然后在onResume后重新创建曲面,但在进入睡眠时不会发生这种情况。似乎我必须破坏整个活动,然后重新创建它以使相机预览再次工作。我希望能够重新创建surfaceview


除了重新创建整个活动外,是否有其他方法强制重新创建surfaceview?

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

我也有同样的问题,原因如下:

onPause方法不回收我创建的CameraPreview类(实现SurfaceView回调)。我没有尝试重新实例化整个对象本身,而是将传递给它的摄影机对象引用更新为

null

我调用了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);
}

+1谢谢你,这确实有帮助!但是:在摄像头实现中,我还必须传递我拍摄和保存的图像的文件Uri,而不是将原始字节数组传递回调用摄像头的活动,因为尝试传递字节数组会在睡眠后导致绑定事务失败。Jason的解决方案适用于我的4.0及以上设备,但我的3.0及以下设备仍表现出相同的症状。有什么建议吗?老兄,这是一个困扰我三天却无法入睡的问题的答案:D谢谢!
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);
}