Camera

Cameraはカメラを扱うクラス・・・。

Camera | Android Developers

まずは、カメラを起動してシャッターを押すまでに表示されるプレビュー画面をアクティビティ上に表示するところまでをやる・・・。

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(横)で固定・・・。
再設定をしないために、縦だとうまく表示されないので、こうした・・・。

f:id:BG1:20161214105537p:plain

アプリを起動した状態でスクリーンショットを撮った・・・。
端末は横の状態である・・・。Androidも横の状態と認識している・・・。

f:id:BG1:20161214105636p:plain

今度は端末を縦にしてスクリーンショットを撮った・・・。
しかし、landscapeで固定しているのでAndroidとしては横の状態として認識し、スクリーンショットとしてはこうなっている・・・。

Sample/android/Camera/Camera/src/Camera at master · bg1bgst333/Sample · GitHub