Cameraはカメラを扱うクラス・・・。
まずは、カメラを起動してシャッターを押すまでに表示されるプレビュー画面をアクティビティ上に表示するところまでをやる・・・。
activity_main.xmlは、
プレビュー画面はSurfaceViewに表示する・・・。
SurfaceView | Android Developers
SurfaceViewは本来、ゲームなどの高速描画を実現するときに使う・・・。
カメラのプレビューにも使われる・・・。
MainActivity.javaは、
Cameraオブジェクトcameraを定義し、surfaceViewを取得したら、surfaceView.getHolderでholderを取得・・・。
以降はholderを通じて、surfaceViewをcameraと紐づけていく・・・。
holder.addCallbackでSurfaceViewのコールバック(リスナーじゃないのか・・・。)をセット・・・。
そのために、MainActivityにSurfaceHolder.Callbackをimplements・・・。
SurfaceViewの画面作成時surfaceCreatedでは、Camera.openでcameraを取得・・・。
camera.setPreviewDisplayにholderを渡すことで、cameraの映像がsurfaceViewに表示される・・・。
ここはtry-catch文でハンドリングしないといけない・・・。
画面破棄時surfaceDestroyedでは、camera.stopPreviewでプレビューを停止、camera.releaseでカメラを解放しnullをセット・・・。
端末を横にしたり、また縦にしたりして、端末の状態が変わったときsurfaceChangedが呼ばれて、そこで画面の再設定をするのだが、パラメータ設定で落ちてしまうので、今回は設定せずにプレビューを再開することにした・・・。
(このパラメータ設定で落ちるという現象はCamera初心者ではよくあることらしい・・・。闇深いなあ・・・。そりゃCamera2が出てくるわけだ・・・。)
あとは、AndroidManifest.xmlで、
Cameraのパーミッションを追加・・・。
さらに、画面をlandscape(横)で固定・・・。
再設定をしないために、縦だとうまく表示されないので、こうした・・・。
アプリを起動した状態でスクリーンショットを撮った・・・。
端末は横の状態である・・・。Androidも横の状態と認識している・・・。
今度は端末を縦にしてスクリーンショットを撮った・・・。
しかし、landscapeで固定しているのでAndroidとしては横の状態として認識し、スクリーンショットとしてはこうなっている・・・。
Sample/android/Camera/Camera/src/Camera at master · bg1bgst333/Sample · GitHub