Galaxy Sでカメラアプリを使用する時の注意点

もちろん、アプリ開発の話です。

結論から言うとカメラアプリを起動すると呼び出し元が縦向き(Portrait)でも、必ず横向き(Landscape)にされます。
よーするに、変な動きします。



大抵のアプリは以下の2つの条件がそろって問題がおきません。
 ・カメラが横向きじゃないと使えなかった
 ・撮影した画像をそのままの向きで見て加工などをするという関係でアプリが横向き専用だった
  この場合は、もともと画面が横向きなのでセーフ。

そうそう、カメラの呼び出し方法は「AndroidSDK開発のレシピ―104個のレシピで学ぶAndroidアプリ開発の極意」塚田 翔也 (著) の、レシピ088あたりを参考にしてくださいね。(もちろん宣伝ですw)

話を戻して。

回避方法としては、Y.A.M の 雑記帳 「Android 画面の縦横切り替え時に元の画面を保存」を参考に「onConfigurationChanged」イベントを拾うように変更します。

マニフェストには下記の記述で行けると思います。
<activity android:name=".HelloWorld"
    android:label="@string/app_name"
    android:configChanges="orientation|keyboardHidden">

なんで、そんなことをしないといけないかというと以下に問題が発生している時のイベントの流れと対策後のイベントの流れを比較してください。


対策前(縦状態からスタート)
11-24 23:35:23.331: DEBUG/test(14180): onCreate
11-24 23:35:23.417: DEBUG/test(14180): onStart
11-24 23:35:23.417: DEBUG/test(14180): onResume
カメラをstartActivityForResultで起動
11-24 23:35:29.378: DEBUG/test(14180): onPause
11-24 23:35:30.436: DEBUG/test(14180): onStop
カメラ→撮影→OK
11-24 23:35:48.167: DEBUG/test(14180): onDestroy : getChangingConfigurations=128
11-24 23:35:48.171: DEBUG/test(14180): onCreate
これ困るよね
11-24 23:35:48.198: DEBUG/test(14180): onStart
11-24 23:35:48.198: DEBUG/test(14180): onActivityResult
11-24 23:35:48.311: DEBUG/test(14180): onResume
11-24 23:35:48.405: DEBUG/test(14180): onPause
11-24 23:35:48.409: DEBUG/test(14180): onStop
11-24 23:35:48.409: DEBUG/test(14180): onDestroy : getChangingConfigurations=128
11-24 23:35:48.421: DEBUG/test(14180): onCreate
11-24 23:35:48.444: DEBUG/test(14180): onStart
11-24 23:35:48.448: DEBUG/test(14180): onResume
11-24 23:35:48.448: DEBUG/test(14180): onPause
11-24 23:35:48.448: DEBUG/test(14180): onStop
11-24 23:35:48.448: DEBUG/test(14180): onDestroy : getChangingConfigurations=128
11-24 23:35:48.456: DEBUG/test(14180): onCreate
11-24 23:35:48.479: DEBUG/test(14180): onStart
11-24 23:35:48.479: DEBUG/test(14180): onResume
onDestroyでコンフィグの変更状況を確認すると128の回転が発生している。


対策後(縦状態からスタート)
11-24 23:32:53.182: DEBUG/test(14012): onCreate
11-24 23:32:53.362: DEBUG/test(14012): onStart
11-24 23:32:53.362: DEBUG/test(14012): onResume
カメラをstartActivityForResultで起動
11-24 23:33:00.432: DEBUG/test(14012): onPause
11-24 23:33:01.780: DEBUG/test(14012): onStop
カメラ→撮影→OK
11-24 23:33:40.053: DEBUG/test(14012): onConfigurationChanged : newConfig={ scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=247 FlipFont=0}
orien=2で横向きになってる
11-24 23:33:40.053: DEBUG/test(14012): onActivityResult
11-24 23:33:40.151: DEBUG/test(14012): onStart
11-24 23:33:40.151: DEBUG/test(14012): onResume
11-24 23:33:40.186: DEBUG/test(14012): onConfigurationChanged : newConfig={ scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=1/1 orien=1 layout=34 uiMode=17 seq=248 FlipFont=0}
orien=1で縦に戻ってる


オマケ
対策前(横状態からスタート)
11-24 23:58:10.874: DEBUG/test(14327): onCreate
11-24 23:58:10.983: DEBUG/test(14327): onStart
11-24 23:58:10.983: DEBUG/test(14327): onResume
カメラをstartActivityForResultで起動
11-24 23:58:14.077: DEBUG/test(14327): onPause
11-24 23:58:14.874: DEBUG/test(14327): onStop
カメラ→撮影→OK
11-24 23:58:22.628: DEBUG/test(14327): onActivityResult
11-24 23:58:23.096: DEBUG/test(14327): onStart
11-24 23:58:23.096: DEBUG/test(14327): onResume