Androidカメラプレビューの利用
Androidのカメラプレビューを使うには
SurfaceViewを設置してプレビュー領域を作成
そして、Cameraクラスの
startPreview()を使ってプレビューを開始する
まずは、SurfaceViewの設置
これは、レイアウトファイルとなるXMLファイルへ追加する
<SurfaceView android:id="@+id/view" android:layout_width="match_parent" android:layout_height="match_parent"/>
次に、SurfaceHolderを取得して
コールバック処理を追加する
これは、設置した SurfaceView から
SurfaceHolder を取得し
SurfaceViewの生成時
変更時、破棄時のときの処理を追加する
コールバック処理は、そのときに行う処理のこと
まずは、SurfaceHolderの取得
mSurfaceHolder = mSurfaceView.getHolder();
次に、処理の追加
処理の追加は、addCallback()で追加できる
とりあえず、プロトタイプ
mSurfaceHolder.addCallback( @Override public void surfaceDestroyed(SurfaceHolder holder){ //破棄時の処理 } @Override public void surfaceCreated(SurfaceHolder holder){ //生成時の処理 } @Override public void surfaceChanged(SurfaceHolder holder int format, int width, int height){ //変更時の処理 } )
これで、だいたいの骨格ができたので
次に、生成時の処理になる
surfaceCreated()の中身を書いていく
ここでは、カメラの初期化
そして、デバイスで利用できる
カメラプレビュー一覧も取得する
なお、取得失敗も考慮し、try catchで処理する
@Override public void onCreated(SurfaceHolder holder){ //カメラの初期化処理 mCamera = Camera.open(); if(mCamera !=null){ try{ mCamera.setPreviewDisplay(mSurfaceHolder); }catch(IOException e){ e.printStackTrace(); } //利用可能なプレビューサイズの取得 mSupportedPreviewSize = mCamera.getParameters().getSupportedPreviewSizes(); } }
次に、SurfaceChanged()の中身を書いていく
ここでは、ディスプレイサイズから
カメラプレビューに最適なサイズを選択し
カメラプレビューを開始する
@Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){ if(mCamera !=null){ Parameters param = mCamera.getParameters(); if(mSupportedPreviewSizes !=null){ //ディスプレイサイズに最適なサイズを設定 mPreviewSize = CameraUtil.getOptimalPreviewSize(mSupportedPreviewSizes, width, height); //カメラのプレビューサイズをセット param.setPreviewSize(mPreviewSize.width, mPreviewSize.height); mCamera.setParameters(param); } //プレビュー開始 mCamera.startPreview(); } }
そして、
surfaceDestroyed()へ
SurfaceView破棄時のコールバック処理を書く
ここでは、カメラプレビューを使わなくなったときの処理を書く
@Override public void surfaceDestroyed(SurfaceHolder holder){ //カメラの終了処理 mCamera.stopPreview(); mCamera.release(); mCamera =null; }
あとは、カメラを扱うため
AndroidManifest.xmlへ権限を追記する
<uses-permission android:name="android.permission.CAMERA"/>
あと、surfaceHolder へ
addCallback()
で、コールバックを追加すると
以下のメソッドかわ追加される
surfaceDestroyed(SurfaceHolder holder)
これは、SurfaceViewが破棄されたときに呼ばれる
surfaceCreated(SurfaceHolder holder)
これは、SurfaceViewが生成されるときに呼ばれる
surfaceChanged(SurfaceHolder holderint format, int width, int height)
これは、SurfaceViewが変更されたときに呼ばれる
カメラプレビューでこれらのメソッドを使う場合
onSurfaceCreated()で
カメラを初期化
onSurfaceChanged()で
プレビューの設定と開始処理
onSurfaceDestroyed()で
カメラの終了処理をする
次に、カメラパラメーターの設定
カメラは、プレビューを開始する前に
カメラに様々なパラメーターを追加できる
プレビューサイズもパラメーターに該当するため
パラメーター扱いで変更できる
カメラパラメーターは
Camera.getParameters()で取得し
setParameters()でセットする
あと、Androidはデバイスごとに画面のプレビューサイズが代わるため
CameraUtilクラスの
getOptimalPreviewSize()を使う