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

Sud*_*han 38 android android-camera-intent android-activity

我有两项活动(A1,A2).A1调用A2,从A2调用相机意图,如下所示

launchIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
launchIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoPath);   
startActivityForResult(launchIntent,CAMERA_REQUEST);
Run Code Online (Sandbox Code Playgroud)

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

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

android:configChanges="keyboardHidden|orientation|locale"
android:screenOrientation="portrait
Run Code Online (Sandbox Code Playgroud)

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

Plz分享你对此的想法.提前致谢

小智 80

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

android:configChanges="orientation|screenSize"

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

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

  • android:configChanges="orientation|keyboardHidden|screenSize" http://stackoverflow.com/questions/16154279/galaxy-s3-taking-picture-in-portrait-mode-destroys-activity (5认同)

Raj*_*wal 37

启动相机需要大量内存.因此,在内存较低的设备上,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);
    }
Run Code Online (Sandbox Code Playgroud)

如果你在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);
    }
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,这解决了问题。感谢为活动和片段提供解决方案。真的很好的答案。 (2认同)
  • 我面临着同样的问题,但是我的片段的onSaveInstanceState从未被调用。只有我活动的onDestory方法被调用。有什么办法吗? (2认同)

小智 23

确保您没有"不要保持活动"开发人员设置,因为它会破坏您要离开的活动.

  • 我只是浪费了一天的工作,试图找出我的应用程序有什么问题.谢谢你! (5认同)
  • 但你的应用程序应该仍然有效,并且不会因为"不要保持活动"而崩溃,不应该吗? (5认同)

laa*_*lto 13

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