今回はカメラの最後 Controlling the Camera
です。
前回2回はカメラ機能は基本アプリに投げて
出力を貰って処理する話でしたが、
今回はカメラそのものを操作する話になります。
まずカメラの取得からです。
もし他のアプリがカメラを使用している場合、取得できません。
private boolean safeCameraOpen(int id) {
boolean qOpened = false;
try {
releaseCameraAndPreview();
mCamera = Camera.open(id);
qOpened = (mCamera != null);
} catch (Exception e) {
Log.e(getString(R.string.app_name), "failed to open Camera");
e.printStackTrace();
}
return qOpened;
}
カメラの解放です。処理を終えたら必ず解放しましょう。
private void releaseCameraAndPreview() {
mPreview.setCamera(null);
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
次に、カメラ自体が見ている映像を表示する
プレビュークラスを作る必要があります。
class Preview extends ViewGroup implements SurfaceHolder.Callback {
SurfaceView mSurfaceView;
SurfaceHolder mHolder;
Preview(Context context) {
super(context);
mSurfaceView = new SurfaceView(context);
addView(mSurfaceView);
カメラのハードウェアからアプリケーションに画像データを渡すため
コールバックメソッドを追加
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
...
}
そして、開いたカメラとプレビューを関連つけて
カメラをセットします。
public void setCamera(Camera camera) {
if (mCamera == camera) { return; }
stopPreviewAndFreeCamera();
mCamera = camera;
if (mCamera != null) {
List<Size> localSizes = mCamera.getParameters().getSupportedPreviewSizes();
mSupportedPreviewSizes = localSizes;
requestLayout();
try {
カメラにプレビューを設定
mCamera.setPreviewDisplay(mHolder);
} catch (IOException e) {
e.printStackTrace();
}
カメラの初期化プロセス
mCamera.startPreview();
}
}
とりあえずこれでカメラを使用する準備は整いました。
次はカメラの操作です。
カメラのズームレベルから露出補正など各種設定変更ができます。
これはプレビューサイズの変更例です。
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
requestLayout();
mCamera.setParameters(parameters);
プレビューの更新処理
mCamera.startPreview();
}
プレビューの回転角度設定メソッド
setCameraDisplayOrientation()
写真を撮る
Camera.takePicture()
取った写真のデータを受け取る
Camera.PictureCallback
写真を撮った後プレビューを再起動する必要があります。
@Override
public void onClick(View v) {
switch(mPreviewState) {
case K_STATE_FROZEN:
mCamera.startPreview();
mPreviewState = K_STATE_PREVIEW;
break;
default:
mCamera.takePicture( null, rawCallback, null);
mPreviewState = K_STATE_BUSY;
} // switch
シャッターボタンを押した後に再起動させる
shutterBtnConfig();
}
最後にカメラの停止です。
必ずプレビューを停止してからカメラを解放させましょう。
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCamera != null) {
mCamera.stopPreview();
}
}
private void stopPreviewAndFreeCamera() {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
本日は以上です。