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:调用相机意图后活动被破坏的主要内容,如果未能解决你的问题,请参考以下文章

当通过意图从相机应用程序返回时,Android 活动被破坏

启动相机意图时未调用 onActivityResult?

防止新意图或切换应用程序破坏活动

android方向 - 意图问题(相机)

Android - 相机和画廊意图后的裁剪给出了奇怪的结果

相机意图应用程序崩溃