48

我有两个活动(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) 被破坏

请分享你对此的想法。提前致谢

4

6 回答 6

83

我有同样的问题。我会疯的,但最后我在这里找到了解决方案。问题是,当您单击相机的“保存”按钮时,活动调用更改方向方法,它将销毁并重新创建。尝试设置

android:configChanges="orientation|screenSize"

在 android 清单中(不仅android:configChanges="orientation"因为这里建议,它不适用于 API 级别 13 或更高级别)。

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

于 2013-05-14T14:21:23.550 回答
44

启动相机需要大量内存。因此,在内存不足的设备上,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);
    }
于 2014-11-03T05:24:55.793 回答
26

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

于 2013-11-17T05:50:35.773 回答
13

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

于 2013-04-15T12:27:56.077 回答
2

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

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

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

是的,只有当我在横向模式下拍照时才会发生这种情况。如果我拍肖像照,到目前为止一切都很好..

我会尝试android:configChanges="orientation|screenSize" 按照这里的建议使用..希望它会有所帮助!

于 2016-02-26T09:20:04.870 回答
2

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

于 2018-07-17T10:27:19.730 回答