web-dev-qa-db-ja.com

Android:Camera Intentを呼び出した後にアクティビティが破壊される

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のチェックボタン)をクリックすると問題が発生し、A2のonDestroyメソッドが呼び出される代わりに、私のonActivityResultが呼び出されません。 onActivityResult fnで実行するロジックはほとんどありません。

私はこれについてStackoverflowのいくつかの投稿を読んでいましたが、それから有用な出力を得ることができませんでした。2番目のActivity(A2)でこのようなマニフェストを持っています

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

注: HTC One XではonActivityResult fnが呼び出されますが、S3では2番目のActivity(A2)が破棄されます

Plzはこれについてあなたの考えを共有します。前もって感謝します

37
Sudarshan

私は同じ問題を抱えていました。私は夢中になりますが、最終的に解決策を見つけました ここ 。問題は、カメラの「保存」ボタンをクリックすると、アクティビティ呼び出しが方向メソッドを変更し、それが破棄されて再作成されることです。設定してみてください

Android:configChanges="orientation|screenSize"

in Android manifest(Android:configChanges="orientation"提案されているように ここ であるため、APIレベル13以上では機能しません)。

活動を破壊するのを防ぎ、私のために働きます。

80
giacomo87

カメラを起動するには大量のメモリが必要です。したがって、メモリが少ないデバイスでは、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);
    }
36
Rajesh Narwal

「アクティビティを保持しない」開発者設定がオンになっていないことを確認してください。これにより、離れるアクティビティが破壊されます。

23
Omaraf

カメラアプリは大量のメモリを必要とし、メモリを解放するために、オペレーティングシステムはバックグラウンドアプリを殺す必要があります。これはすべてのAndroidアプリ。カメラアプリが戻ったときにアクティビティが再作成されます。アクティビティの状態情報を保持するには、onSaveInstanceState()をオーバーライドしてデータを保存し、 onCreate()

13
laalto

私のアクティビティには、カメラインテントを呼び出すときに実行される多くのタスクがあります。GPSロケーションリスナーと、さらに多くのタスクがあります。

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

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

そして、はい、それは風景モードで写真を撮るときにのみ起こります。私がポートレートで写真を撮る場合、これまでのところすべてがうまくいきます。

ここで提案されているように、Android:configChanges="orientation|screenSize"を使用しようとします。

1
Moti Bartov

私にとっては、開発者モードで「アクティビティを保持しない」というオプションを有効にすると発生します。チェックを外した後、ギャラリーまたはカメラアプリから画像を選択することで、バックアップ中にアクティビティが再作成されません。

1
Shihab Uddin