2011-11-05 61 views
4

我已经创建了一个自定义相机预览视图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方法? 我知道在SurfaceView有隐藏hideSurface()showSurface(),但我不想走这条路。

+0

你有没有试图释放相机中的onStop()方法呢?同样,您可以在onStart()中打开/重新打开相机预览。 – Houf

回答

0

这是正确的,你已经打开你的相机在onStart方法,并释放它在你的活动的onStop方法。 onResume和onPause方法是android活动的可见生命周期的一部分。当另一个活动占据整个可见空间时,OnStop被调用。当另一个活动到达前台时,甚至会调用OnPause,即使它没有占用整个可见空间,例如意图选择器对话框在弹出时所做的操作。所以我想把你的相机创建和发布到正确的生命周期方法应该做的伎俩。 你可以在这里找到关于该活动的生命周期的详细信息,但我敢肯定,你所熟悉的是:

http://developer.android.com/reference/android/app/Activity.html