Android 電源ボタンを押すとSurfaceViewがおかしくなる

Android
Android ビデオ録画機能を作る

Android 電源ボタンを押すとSurfaceViewがおかしくなる

Androidのビデオ機能作成に取り組んでいる私ですが(Android ビデオを録画するサンプルコード)、またまた問題が発生しました…。
電源ボタンを押すと、SurfaceViewで表示する録画のプレビュー画面が電源ボタンを押したままの状態で固まってしまうんです。

理由を調べると、なんと電源ボタンを押して、また電源ボタンを押して戻った時は、

 surfaceCreated

が呼ばれない、そして

 surfaceChanged

が呼ばれる順番が違うのでした…。(ちなみに、ある程度の時間放置してスリープになる場合もこれと同様です。)
しかも、これはなんとAndroidの機種によって違うようです!!

  • Galaxys3aではこう
 //電源ボタンを押したとき
 05-26 11:08:43.017: I/MenuActivity(17260): onPause
 05-26 11:08:43.708: I/MenuActivity(17260): onStop
  
 //電源ボタンを押して復帰
 06-24 15:01:30.556: I/MenuActivity(13091): surfaceChanged
 06-24 15:01:30.906: I/MenuActivity(13091): onResume()
 06-24 15:01:31.631: I/MenuActivity(13091): surfaceChanged
  • Xperia SO 04Dではこう
 //電源ボタンを押したとき
 05-26 11:08:43.017: I/MenuActivity(17260): onPause
 05-26 11:08:43.708: I/MenuActivity(17260): onStop
  
 //電源ボタンを押して復帰
 06-24 15:01:30.906: I/MenuActivity(13091): onResume()

普通に最初にアプリ立ち上がり時はこう

 //最初に画面を作る時
 05-26 11:04:30.439: I/MenuActivity(17260): onCreate
 05-26 11:04:51.101: I/MenuActivity(17260): onCreate
 05-26 11:04:51.201: I/MenuActivity(17260): onResume
 05-26 11:04:51.531: I/MenuActivity(17260): surfaceCreated
 05-26 11:04:51.531: I/MenuActivity(17260): surfaceChanged

ちなみに、ホームボタンをタップした時はこう

 //ホームボタン
 05-26 11:09:34.472: I/MenuActivity(17260): onPause
 05-26 11:09:35.073: I/MenuActivity(17260): surfaceDestroyed
 05-26 11:09:35.823: I/MenuActivity(17260): onStop
  
 //ホームボタンから復帰
 05-26 11:09:39.007: I/MenuActivity(17260): onResume
 05-26 11:09:39.277: I/MenuActivity(17260): surfaceCreated
 05-26 11:09:39.277: I/MenuActivity(17260): surfaceChanged

Backボタンを押した時はこう

 //Backボタン
 05-26 11:11:26.822: I/MenuActivity(18100): onPause
 05-26 11:11:27.322: I/MenuActivity(18100): surfaceDestroyed
 05-26 11:11:27.743: I/MenuActivity(18100): onStop
 
 //Backから復帰
 05-26 11:12:08.326: I/MenuActivity(18100): onCreate
 05-26 11:12:08.436: I/MenuActivity(18100): onResume
 05-26 11:12:08.797: I/MenuActivity(18100): surfaceCreated
 05-26 11:12:08.797: I/MenuActivity(18100): surfaceChanged
 05-26 11:12:12.461: I/MenuActivity(18100): onPause

電源ボタンやスリープの場合だけ、surfaceCreatedが呼ばれないんですね(>_<) さて、解決方法というか、StackOverFlowさんによい例が書いてありましたので、紹介します。 http://stackoverflow.com/questions/11495842/how-surfaceholder-callbacks-are-related-to-activity-lifecycle

下手に使うと、カメラが落ちたりします。
原因は、大体

 camera.release();

がカメラ生成前に呼ばれていないことです。

とにかくフラグを使ってなんとかするのは面倒ですし、ソースコードもごちゃごちゃになってくるので避けたいですが、致し方ないですよね。

Good Luck!! [huh]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です