Android:调用Camera Intent后,Activity被销毁

时间:2013-04-15 12:16:25

标签: 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);

打开相机,我可以拍照。但是一旦我点击了保存按钮(s3中的勾选按钮),问题就出现了,我的 onActivityResult 没有被调用,而是调用了A2的onDestroy方法。我在onActivityResult fn中完成的逻辑很少。

我已经阅读了Stackoverflow中关于此的一些帖子,但我无法从中得到有用的输出。我的第二个活动(A2)中有我的清单

android:configChanges="keyboardHidden|orientation|locale"
android:screenOrientation="portrait

注意:在HTC One X中,我的onActivityResult fn被调用,但在我的S3中,第二个Activity(A2)被破坏了

Plz分享您对此的看法。在此先感谢

6 个答案:

答案 0 :(得分:79)

我有同样的问题。我会疯了但最后我找到了解决方案here。 问题是当你点击相机的“保存”按钮时,活动调用改变方向方法,它将被破坏并重新创建。 尝试设置

android:configChanges="orientation|screenSize"

在Android清单中

(不仅android:configChanges="orientation",因为建议here,它不适用于API级别13或更高级别。)

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

答案 1 :(得分:35)

启动相机需要大量内存。因此,在具有低内存的设备上,android系统会关闭在后台运行的Activities,因此会调用onCreate()。 由于你给出的这个photopath变成了null,你将无法获得保存的图像。

解决方法是在系统破坏您的活动时保存photopath,然后再次恢复。

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

答案 2 :(得分:23)

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

答案 3 :(得分:13)

相机应用程序需要大量内存并释放内存,操作系统必须杀死后台应用程序,包括你的应用程序。这对所有Android应用都是正常的。当相机应用程序返回时,您的活动将被重新创建。要保留活动状态信息,请覆盖onSaveInstanceState()以存储您的数据,并在onCreate()中将其读回。

答案 4 :(得分:1)

当我调用Camera Intent时,我的Activity有很多任务在运行。 我有GPS位置监听器,还有更多任务。

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

如果每次我调用Camera Intent时它都会破坏我的Activity,那么我之前所有关于标记及其位置的信息都会丢失。 而且,我将不得不再次初始化地图。这对我的应用来说是个大问题。

是的,只有当我在风景模式下拍照时才会发生。如果我拍摄肖像照片到目前为止一切都很好..

我会尝试使用android:configChanges="orientation|screenSize" 正如这里所说..希望它会有所帮助!

答案 5 :(得分:1)

对我来说,当我在开发人员模式下启用名为“ 不要保留活动”的选项时,就会发生这种情况。在我取消选中它之后,从图库或相机应用程序中选择图片作为支持将不会重新创建活动。