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!!