カメラの使用方法(1)


今回はカメラの使い方について説明します。
とりあえず今回はSurfaceViewにカメラから得られる画像のプレビュー画面を表示するところまで紹介して、
撮影処理は次回ご紹介します。

作業手順として以下のようになります。

  • マニフェストファイルにカメラのパーミッションを追加する
  • レイアウトファイルにSurfaceViewを追加する
  • プレビュー画面の実装

詳しくは続きからどうぞ。

マニフェストファイルにカメラのパーミッションを追加する

アプリケーションからカメラを使用するために、
マニフェストファイル(AndroidManifest.xml)に以下のコードを追記します。

<uses-permission android:name="android.permission.CAMERA" />

レイアウトファイルにSurfaceViewを追加する

プレビュー画面となるSurefaceViewをレイアウトファイル(main.xml)に記述します。

<SurfaceView
	android:id="@+id/surface_view"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content" />
</LinearLayout>

プレビュー画面の実装

続いてプレビュー画面の実装です。
プレビュー画面の実装にはSurfaceHolder.Callbackを使って、
SurfaceViewの生成時、破棄時、変更時に適切な処理を実装します。

package com.example.camera;

import android.app.Activity;
import android.os.Bundle;
import android.hardware.Camera;
import android.view.SurfaceView;
import android.view.SurfaceHolder;

public class CameraTest extends Activity {
	private Camera myCamera;

	private SurfaceHolder.Callback mSurfaceListener =
		new SurfaceHolder.Callback() {
			public void surfaceCreated(SurfaceHolder holder) {
				// TODO Auto-generated method stub
				myCamera = Camera.open();
				try {
					myCamera.setPreviewDisplay(holder);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

			public void surfaceDestroyed(SurfaceHolder holder) {
				// TODO Auto-generated method stub
				myCamera.release();
				myCamera = null;
			}

			public void surfaceChanged(SurfaceHolder holder, int format, int width,
					int height) {
				// TODO Auto-generated method stub
				Camera.Parameters parameters = myCamera.getParameters();
				parameters.setPreviewSize(width, height);
				myCamera.setParameters(parameters);
				myCamera.startPreview();
			}
		};

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        SurfaceView mySurfaceView = (SurfaceView)findViewById(R.id.surface_view);
        SurfaceHolder holder = mySurfaceView.getHolder();
        holder.addCallback(mSurfaceListener);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
}

SurfaceViewのコールバック関数で実装している内容を順に見ていきますと、

  • surfaceCreated:SurfaceViewが生成されたらカメラをオープンする
  • surfaceDestroyed:SurfaceViewが破棄されたらカメラを解放する
  • surfaceChanged:SurfaceViewの大きさやフォーマットが変わったらプレビューの大きさを設定する

のようになります。
コールバック関数を実装できたら、あとはholder.addCallback()でコールバック関数を登録します。

以上で、とりあえずカメラのプレビューができるようになります。
次回はシャッターを押したらプレビューの内容を撮影するところまで行きたいと思います。

4 Comments