2011-12-22 7 views
1

私のコードは、より小さくて大きなデバイス(Motorola Xoom、Samsung Galaxy Player 4.0、Kyocera Digno)では期待通りに動作しますが、ACTION_IMAGE_CAPTUREインテントそしてもちろん望ましくないとする、アプリがonDestroy()を返すときonActivityResult()そしてonCreate()が続く、と呼ばれ、写真を撮るが呼び出され、そして最後に、onDestroy()onCreate()が再び呼び出され - だけonActivityResult()と呼ばれるべきです。Samsung Galaxy Tab 7.0は、カメラの意図から戻ってアプリを再起動します

Possibles手がかり:

  • 銀河タブ7.0が明示的にマニフェストファイルでサポートされていない画面サイズ(これは私がサポートされていない画面サイズでテストしている唯一のデバイスである)ので、ユーザを有しますびっくりするか、フィットするかを選択できます。どちらのUIも同じ(悪い)動作をします。
  • 画像のプレビュー時にカメラの動作が向きを変えているようです。私のアプリはポートレートモード(編集:小さい画面でのみサポート - xlarge以外の画面では、方向の変更をサポートしています)。多分、オリエンテーションの変更は何とか私の活動を破壊しているのかもしれない。
  • 私は別の意図(電子メールの意図)から起動して返そうとしましたが、その場合、私のアプリケーションは破壊されずに再作成されません。

詳細情報やコードサンプルが必要な場合は教えてください。

編集:方向変更に問題が絞り込まれています。 Karthikの答えによれば、android:configChanges="orientation"と設定すると問題が解決されます。唯一の問題は、私のアプリがxlarge画面で方向変更をサポートしていることです。この設定は、これらのデバイスでこの機能を無効にします。 android:configChanges="@string/config_changes"を使用して試してみましたが、画面サイズによって異なる文字列を入力していましたが、今は「インストールエラー:INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION」が表示されています。これによれば、Android Activity, how to override manifest's android:configChanges with Java code?には、プログラムで設定する方法がありません。私の唯一のオプションは、私のアプリのすべての方向変更を手動で処理するために残っていますか?

+0

私はあなたがXLARGE画面のために、手動で活動中の向きの変更を処理する必要が推測します。または、xlargeデバイスの場合は、APKを個別に変更する必要があります。 – Karthik

答えて

2

私は、カメラアプリを起動してOSがメインアクティビティをリサイクルするときにデバイスのメモリが不足していることが原因で私のアプリが再起動されることを発見しました。これは問題ではありません。ただし、私はフラグメントベースのレイアウトがあり、いくつかのフラグメント初期化はsavedInstanceStateに関係なくonCreate()で実行されています。これにより、自動的にFragment Restoreが破棄され、実際に復元しようとしたときに最初から再起動しているように見えるようになりました。

例:savedInstanceStateがnullではなかったし、状態がonSaveInstanceState()に正しく保存され、onCreate()に復元されたことを確認しました、とのために通常の取扱いを実施したときに

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // add main menu -- WRONG! 
    MainMenuFragment mainMenu = new MainMenuFragment(); 
    FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction(); 
    ft.add(R.id.contents, mainMenu); 
    ft.commit(); 

    if (savedInstanceState != null) { 
     // <restore state> 
    } 
    else { 
     // <initialize stuff> 
    } 
} 

はそれを修正するには、私は、フラグメントの初期化をスキップonActivityResult()

例:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (savedInstanceState != null) { 
     // <restore state> 
    } 
    else { 
     // <initialize stuff> 

     // add main menu -- CORRECT! 
     MainMenuFragment mainMenu = new MainMenuFragment(); 
     FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction(); 
     ft.add(R.id.contents, mainMenu); 
     ft.commit(); 
    } 
} 
2

あなたが正しいです、それは方向変更のためです。カメラはギャラクシータブの風景モードで動作します。
したがって、マニフェストファイルの<activity>タグにandroid:configChanges="orientation"を追加できます。

これが問題を解決します。 onDestroy()onCreate()は、カメラからの返却時に呼び出されません。

+0

この[リンク](http://developer.android.com/guide/topics/manifest/activity-element.html#config)に従って、 'screenSize'も追加する必要があります。 – Karthik

+0

ありがとう、これは多くの助けとなりました。しかし、これは別の問題を引き起こす。私の編集を見てください – Ken

関連する問題