Android開発記録雑記 -7ページ目

Android開発記録雑記

パソコン中級者ぐらいの私が
スマホアプリの開発をしてみようと思い立ち
Androidで動くアプリ開発過程をこれから書き記していきます。

今回はカメラの最後 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;
    }
}


本日は以上です。