我创建了一个CameraView
扩展的自定义相机预览视图,SurfaceView
它还实现了SurfaceHolder.Callback
接口。视图与相机一起操作。当您打开视图时,它会显示相机预览。在同一屏幕上,还覆盖了两个按钮 - “拍照”、“从图库中选择”。保存CameraView
发布和重新打开相机的活动onPause()
和onResume()
方法。
如果我单击“从图库中选择”按钮,则会创建以下意图:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, LOAD_PICTURE);
如果只有一个活动可以响应此意图,那很好。活动自动打开,相机被释放。我也可以在画廊时进行回击,然后我将回到CameraView
活动中,并恢复相机预览。
如果有多个活动可以处理这个意图,那么有趣的部分就会开始,并且会弹出意图选择器对话框。当意图选择器对话框产生,onPause()
在父活动中被调用并且相机被释放时,屏幕变黑。如果我没有从对话框中选择意图,而是单击手机上的后退按钮,onResume()
则会调用,但相机预览永远不会回来。要让相机预览再次显示,我需要返回上一个活动并返回预览活动。
发生以下问题是因为,当对话框被引发时,只会onPause()
被调用,但如果我实际上切换到不同的活动,surfaceDestroyed()
也会被调用。onResume()
当使用后退按钮取消对话框surfaceChanged()
并且surfaceCreated()
永远不会被调用时,情况也是如此。
我的问题是如果取消意图选择器对话框,如何让相机预览重新出现。有没有办法显式触发SurfaceHolder.Callback
方法?我知道有 hiddenhideSurface()
和showSurface()
in SurfaceView
,但我不想走这条路。