48

2 つのアクティビティ (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の投稿を読んだことがありますが、そこから有用な出力を得ることができませんでした.2番目のActivity(A2)用にこのようなマニフェストを持っています

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

注: HTC One X では onActivityResult fn が呼び出されますが、S3 では 2 番目の 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() が呼び出されます。このため、指定したフォトパスが null になり、保存された画像を取得できなくなります。

解決策は、システムがアクティビティを破棄している間にフォトパスを保存してから、再度復元することです。

@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 を呼び出しているときに実行される多くのタスクがあります。 GPS 位置リスナーと、さらに多くのタスクがあります。

カメラの意図から戻ったら、画像が撮影された場所の地図にマーカーを追加する必要があります..したがって、ユーザーが複数の写真を撮った場合は、各写真のマーカーを表示する必要があります..

Camera Intent を呼び出すたびにアクティビティが破棄される場合、マーカーとその位置について以前に持っていたすべての情報が失われます。また、マップを再度初期化する必要があります。それは私のアプリにとって大きな問題です。

はい、風景モードで写真を撮ったときにのみ発生します。ポートレートで写真を撮れば、今のところすべて問題ありません..

ここで提案されているように使用しようとしandroid:configChanges="orientation|screenSize" ます..それが役立つことを願っています!

于 2016-02-26T09:20:04.870 に答える