【问题标题】:Reopening camera after intent chooser is canceled取消意图选择器后重新打开相机
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2018-06-06
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多