Android:调用相机意图后活动被破坏
Posted
技术标签:
【中文标题】Android:调用相机意图后活动被破坏【英文标题】:Android: Activity getting Destroyed after calling Camera Intent 【发布时间】:2013-04-07 13:15:51 【问题描述】:我有两个活动(A1,A2)。 A1 调用 A2 并从 A2 我调用相机意图如下
launchIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
launchIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoPath);
startActivityForResult(launchIntent,CAMERA_REQUEST);
它打开相机,我可以拍照。但是一旦我点击保存按钮(s3 中的勾选按钮),问题就出现了,我的 onActivityResult 没有被调用,而是调用了 A2 的 onDestroy 方法。我在 onActivityResult fn 中几乎没有逻辑要做。
我在 *** 中阅读了一些关于此的帖子,但我无法从中获得有用的输出。我的第二个 Activity(A2) 有这样的清单
android:configChanges="keyboardHidden|orientation|locale"
android:screenOrientation="portrait
注意:在 HTC One X 中,我的 onActivityResult fn 被调用,但在我的 S3 中,第二个 Activity(A2) 被破坏
请分享您对此的看法。提前致谢
【问题讨论】:
需要screenOrientation吗? 是的,我需要我的应用程序在 potrait :( @Surdarshan 嘿!你找到任何可行的解决方案了吗? 您可能需要检查noHistory=true
或`Intent.FLAG_ACTIVITY_NO_HISTORY
。详情见这里:***.com/a/62107555/3763032
【参考方案1】:
我遇到了同样的问题。我会发疯的,但最后我找到了解决方案here。 问题是,当您单击相机的“保存”按钮时,活动调用更改方向方法,它将破坏并重新创建。 尝试设置
android:configChanges="orientation|screenSize"
在 android 清单中(不仅是 android:configChanges="orientation"
,因为建议 here,它不适用于 API 级别 13 或更高级别)。
它可以防止破坏活动,它对我有用。
【讨论】:
android:configChanges="orientation|keyboardHidden|screenSize" ***.com/questions/16154279/… 谢谢你,你救了我 android:configChanges="orientation|keyboardHidden|screenSize" 工作完美。 我遇到了同样的问题,发现在开发人员选项中“不保留活动”检查被标记。评论以寻求其他开发者的帮助。【参考方案2】:启动相机需要大量内存。因此,在内存不足的设备上,android 系统会关闭在后台运行的活动,因此会调用 onCreate()。 由于您给出的这个光路径变为空,您将无法获取保存的图像。
解决方案是在系统破坏您的活动时保存光路径,然后再次恢复。
@Override
public void onSaveInstanceState(Bundle outState)
// TODO Auto-generated method stub
outState.putString("photopath", photopath);
super.onSaveInstanceState(outState);
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
// TODO Auto-generated method stub
if (savedInstanceState != null)
if (savedInstanceState.containsKey("photopath"))
photopath = savedInstanceState.getString("photopath");
super.onRestoreInstanceState(savedInstanceState);
如果您在 Fragment 上执行此操作。
@Override
public void onSaveInstanceState(Bundle outState)
// TODO Auto-generated method stub
outState.putString("photopath", photopath));
super.onSaveInstanceState(outState);
@Override
public void onViewStateRestored(Bundle savedInstanceState)
// TODO Auto-generated method stub
if (savedInstanceState != null)
if (savedInstanceState.containsKey("photopath"))
photopath = savedInstanceState.getString("photopath");
super.onViewStateRestored(savedInstanceState);
【讨论】:
这是正确的答案,这解决了问题。感谢提供活动和片段的解决方案。真的很好的答案。 真的很有帮助!谢谢! 这个方法好很多 我面临同样的问题,但我的片段的 onSaveInstanceState 永远不会被调用。只有我的活动的 onDestory 方法被调用。有什么解决办法吗? 您能否通过发布一些谷歌开发者文档链接来验证您的声明,即低内存设备会在后台关闭活动。【参考方案3】:确保您没有开启“不保留活动”开发者设置,因为它会破坏您要离开的活动。
【讨论】:
我只是浪费了一天的时间试图找出我的应用程序出了什么问题。非常感谢! 但是您的应用程序应该仍然可以工作,并且不会因为“不保留活动”而崩溃,不是吗? 是的,但这不是正常行为。如果您启动了一个activityForResult并丢失了Activity A,那么Camera Intent的结果将无法重建Activity A。 Android 应该能够重新创建它,这就是 onCreate() 和 onSavedInstanceState() 的作用【参考方案4】:相机应用程序需要大量内存,为了释放内存,操作系统必须终止后台应用程序,包括您的应用程序。这对于所有 Android 应用程序都是正常的。当相机应用返回时,您的活动将被重新创建。要保留活动状态信息,请覆盖 onSaveInstanceState()
以存储您的数据并将它们读回 onCreate()
。
【讨论】:
是的,我也期待同样的行为,因为它会再次调用 onCreate 方法,但它没有调用 A2 的 on create 你能把谷歌开发者文档贴在你的声明上吗?请参考。【参考方案5】:当我调用 Camera Intent 时,我的 Activity 有许多任务正在运行。 我有 GPS 位置监听器,还有更多任务。
当它从相机意图返回时,我需要在地图上的图像拍摄位置添加标记.. 因此,如果用户拍摄了多张照片,它应该为每张照片显示标记..
如果每次我调用 Camera Intent 时它都会破坏我的 Activity,那么我之前拥有的关于标记及其位置的所有信息都会丢失。 而且,我将不得不再次初始化地图。这对我的应用来说是个大问题。
是的,只有当我在横向模式下拍照时才会发生这种情况。如果我拍肖像照,到目前为止一切都很好..
我会尝试使用android:configChanges="orientation|screenSize"
正如这里所建议的那样..希望它会有所帮助!
【讨论】:
好吧,添加这个清单后,我可以说问题消失了!!干杯!。此外,如果这与记忆有关,那么当我拍摄肖像图像时也会发生这种情况,正如我所说,它只发生在风景上,所以这是因为方向而不是记忆,这是非常有意义的。【参考方案6】:对我来说,当我在开发者模式中启用一个名为“Don't keep Activities”的选项时,就会发生这种情况。取消选中后,从图库或相机应用程序中选择图片后,活动将不会重新创建。
【讨论】:
以上是关于Android:调用相机意图后活动被破坏的主要内容,如果未能解决你的问题,请参考以下文章