Android 安卓:调用照相机意图后活动被破坏

Android 安卓:调用照相机意图后活动被破坏,android,android-activity,android-camera-intent,Android,Android Activity,Android Camera Intent,我有两项活动(A1、A2)。A1呼叫A2,我从A2呼叫摄像机,如下所示 launchIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); launchIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoPath); startActivityForResult(launchIntent,CAMERA_REQUEST); 它打开相机,我就可以拍照了。但是一旦我单击s

我有两项活动(A1、A2)。A1呼叫A2,我从A2呼叫摄像机,如下所示

launchIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
launchIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoPath);   
startActivityForResult(launchIntent,CAMERA_REQUEST);
它打开相机,我就可以拍照了。但是一旦我单击save按钮(s3中的勾选按钮),问题就出现了,我的onActivityResult不会被调用,而是A2的onDestroy方法被调用。我在onActivityResult fn中有一些逻辑需要完成

我在Stackoverflow上读过一些关于这方面的文章,但我无法从中得到有用的输出。我的第二个活动(A2)有这样的清单

注意:在HTC One X中,我的onActivityResult fn被调用,但在我的S3中,第二个活动(A2)被销毁


请分享你的想法。提前感谢

摄像头应用程序需要大量内存,为了释放内存,操作系统必须关闭后台应用程序,包括您的应用程序。这对于所有Android应用程序来说都是正常的。当摄像头应用程序返回时,将重新创建您的活动。要保留活动状态信息,请覆盖
onSaveInstanceState()
以存储数据,并在
onCreate()
中将数据读回。我也遇到了同样的问题。我会发疯的,但最终找到了解决方案。 问题是,当您单击相机的“保存”按钮时,活动调用更改方向方法,它将销毁并重新创建。 试着设置

android:configChanges=“orientation | screenSize”

在android清单中(不仅是
android:configChanges=“orientation”
,因为正如所建议的,它不适用于API级别13或更高)


它可以防止破坏活动,这对我很有用。

请确保您没有启用“不要保留活动”开发人员设置,因为它会破坏您要离开的活动。

启动摄像头需要大量内存。因此,在内存不足的设备上,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);
    }
如果你在碎片上做这个

@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);
    }

当我调用Camera Intent时,我的活动有许多任务正在运行。。 我有GPS定位监听器,还有更多的任务

当它从相机返回时,我需要在拍摄图像的位置的地图上添加标记。。 因此,如果用户拍摄了多张图片,则应为每张图片显示标记

如果每次我打电话给摄像机时它都会破坏我的活动,那么我以前掌握的关于标记及其位置的所有信息都将丢失。。 而且,我还必须再次初始化映射。这对我的应用程序来说是个大问题

是的,它只发生在我以横向模式拍照时。如果我照肖像照的话,到目前为止一切都很好

我将尝试使用android:configChanges=“orientation | screenSize”

正如这里所建议的。。希望这会有帮助

对我来说,当我在开发者模式下启用一个名为“不要保留活动”的选项时,就会发生这种情况。在我取消选中后,当从gallery或camera应用程序中选择图片时,活动将不会重新创建。

是否需要屏幕定向?是的,我需要我的应用程序位于potrait中:(@Surdarshan嘿!你找到什么有效的解决方案了吗?你可能想检查一下
noHistory=true
或`
Intent.FLAG\u ACTIVITY\u NO\u HISTORY
。详情请看这里:是的,我也希望它会再次调用onCreate方法,但它不会在创建时调用a2。你能在你身上发布谷歌开发者文档吗r声明。仅供参考。android:configChanges=“orientation | keyboardHidden | screenSize”谢谢你,你救了我android:configChanges=“orientation | keyboardHidden | screenSize”工作正常。我也面临同样的问题,发现在开发者选项中“不要保留活动”检查已标记。请评论其他开发人员的帮助。这是正确的答案,这解决了问题。感谢为活动和片段提供解决方案。回答非常好。非常有用!谢谢!这种方法更好。我面临相同的问题,但我的片段的SaveInstanceState从未被调用。只有我的aActivity的onDestory方法被调用。有什么解决方案吗?你能通过发布一些google开发者文档链接来验证你的说法吗?内存不足的设备会在后台关闭活动。我只是浪费了一天的时间试图找出我的应用程序出了什么问题。非常感谢!但是你的应用程序仍然可以工作,不会崩溃“不要保持活动”处于启用状态,是吗?是的,但这不是正常行为。如果您启动了activityForResult并丢失了活动A,则相机意图的结果无论如何都无法重建活动A。Android应该能够重新创建它,这就是onCreate()和onSavedInstanceState()的功能是的,在添加了这个清单之后,我可以说问题已经解决了!!干杯!另外,如果这与记忆有关,那么它也应该发生在我拍摄肖像照片时,正如我所说的,它只发生在风景上,所以很有意义,这是因为方向而不是记忆。
@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);
    }