【发布时间】:2011-12-22 20:07:11
【问题描述】:
我创建了一个自定义相机预览视图CameraView,它扩展了SurfaceView,它还实现了SurfaceHolder.Callback 接口。视图与相机一起操作。当您打开视图时,它会显示相机预览。在同一屏幕上,还覆盖了两个按钮 - “拍照”、“从图库中选择”。持有CameraView 的活动在onPause() 和onResume() 方法中释放并重新打开相机。
如果我单击“从图库中选择”按钮,则会创建以下意图:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, LOAD_PICTURE);
如果只有一个 Activity 可以响应此意图,那很好。活动自动打开,相机被释放。我也可以在画廊时回击,然后我会回到CameraView 活动,并恢复相机预览。
如果有多个活动可以处理这个意图,那么有趣的部分就开始了,并且会弹出意图选择器对话框。当意图选择器对话框产生时,onPause() 在父活动中被调用并且相机被释放,屏幕变黑。如果我没有从对话框中选择意图,而是单击手机上的后退按钮 onResume() 被调用,但相机预览永远不会回来。要让相机预览再次显示,我需要返回上一个活动并返回到预览活动中。
发生以下问题的原因是,当对话框出现时,只有onPause() 被调用,但如果我实际上切换到不同的活动surfaceDestroyed() 也会被调用。当使用返回按钮取消对话框时,onResume() 也是如此,surfaceChanged() 和 surfaceCreated() 永远不会被调用。
我的问题是如果取消意图选择器对话框,如何让相机预览重新出现。有没有办法明确触发SurfaceHolder.Callback 方法?
我知道SurfaceView中有隐藏的hideSurface()和showSurface(),但我不想走这条路。
【问题讨论】:
-
您是否尝试过在 onStop() 方法中释放相机?同样,您可以在 onStart() 中打开/重新打开相机预览。
标签: android camera surfaceview preview surfaceholder