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方法?我知道有 hiddenhideSurface()showSurface()in SurfaceView,但我不想走这条路。

4

1 回答 1

0

没错,您已经在 onStart 方法中打开了您的相机,并在您的活动的 onStop 方法中释放了它。onResume 和 onPause 方法是 android 活动可见生命周期的一部分。当另一个活动占据整个可见空间时调用 OnStop。OnPause 甚至在另一个活动进入前台时被调用,即使它没有占据整个可见空间,例如意图选择器对话框在弹出时所做的那样。因此,我想将您的相机创建和发布移动到正确的生命周期方法中应该可以解决问题。您可以在此处找到有关活动生命周期的更多信息,但我相信您对此很熟悉:

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

于 2013-10-11T07:48:43.690 回答