ユーザーID パスワード

技術情報

  • FAQ よくある質問
  • 個人ユーザー向けサービスのお手続きについて

コード&コラム

第5回
カメラを使ってみよう(前編)


前へ 1 |2 |3 |4 次へ

Step2 カメラ機能の実装

次はカメラ機能の実装です。ここからはこれまで手付かずだったCameraView.javaを編集していきます。

CameraViewはActivityではなく描画を目的としたViewクラスです。普通ならViewを継承するのですが、今回はSurfaceViewというものを継承します。ViewとSurfaceViewの違いですが、SurfeceViewは描画回数(FPS=Frames Per Second)が多く、ゲームや今回のカメラプレビューのような高速連続描画が必要なシーンで使われます。

同時に、CameraViewのコンストラクタも作成しましょう。

public class CameraView extends SurfaceView{
   //コンストラクタ
    public CameraView (Context context){
        super(context);
   }

}

次にSurfaceViewを操作するためにSurfaceHolder.Callbackインターフェースを実装します。これはSurfaceViewが生成されるときや破棄されるときに呼び出される処理を記述するものです。SurfaceHolder.Callbackインターフェースには以下の3つのメソッドが用意されています。


surfaceCreated
(SurfaceHolder オブジェクト名)
サーフェイスを生成する時の処理を記述します。
SurfaceChanged
(SurfaceHolder オブジェクト名, int format, int w, int h)
サーフェイスを変更する時の処理を記述します。 formatにはピクセル仕様、w(widthの省略)とh(heightの省略)には画面の大きさの変更を記述します。
surfaceDestroyed
(SurfaceHolder オブジェクト名)
サーフェイスを破棄する時の処理を記述します。

このままですといまひとつイメージがつかみにくいかもしれませんが、実装しながら慣れていきましょう。

SurfaceHolder.Callbackインターフェースは継承の記述に続けてimplementsを用いてSurfaceHolder.Callbackインターフェースを実装します。
「holder」という名前のSurfaceHolderのオブジェクトを生成しましょう。

クラス内に3つのメソッドも記述しています。

public classCameraView extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder holder;  //サーフェイスホルダーオブジェクト

    //コンストラクタ
    public CameraView (Context context){
        super(context);
    }

    public void surfaceCreated(SurfaceHolder holder){
    }
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h){
    }
    public void surfaceDestroyed(SurfaceHolderholder){
    }

}

SurfaceViewを利用するためにgetHolder()にてサーフェイスホルダーを取得し、addCallback()にてコールバックの通知先を指定します。今回は外部に通知するわけではなくCameraViewクラス自身を指定しているので「this」と指定します。

加えて サーフェイスホルダーの種別を設定します。設定は「setType()」というメソッドで行います。ここで指定する種別はプッシュバッファというもので、GPUに処理させる命令リストをメインメモリに蓄積して一度に処理するという設定です。引数は下記のように指定します。

SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS

それではいよいよカメラについての記述を加えます。 カメラオブジェクトを生成し、サーフェイス生成時にカメラを呼び出した後、表示先としてサーフェイスホルダーを指定します。
カメラの呼び出しは簡単です。オブジェクトに対して以下の命令を記述します。

SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS

表示先のホルダーの指定は先ほど作成したsurfaceCreated()内に記述します。

public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder holder;
    private Camera camera;  //カメラオブジェクトの作成

    //コンストラクタ
    public CameraView (Context context){
        super(context);

        //サーフェイスホルダーの取得とコールバック通知先の指定
        holder = getHolder;
        holder.addCallback(this);
       
         //SurfaceViewの種別をプッシュバッファーに変更します
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder){
        //カメラを呼び出す
        camera = Camera.open();
        //表示先のサーフェイスホルダーを指定
        setPreviewDisplay(SurfaceHolder holder);

    }

続いてはプレビューの設定です。サーフェイス変更時にプレビューを開始するようにします。プレビューの開始には以下のメソッドを利用します。

startPreview()

変更後は以下の様になります。

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h){
    //プレビューの開始
    camera.startPreview();

}

続いて、サーフェイス破棄時の処理を記述します。
コールバックの値を空にし、プレビュー カメラの利用 オブジェクトを停止します。

public void surfaceDestroyed(SurfaceHolderholder){
    camera.setPreviewCallback(null);//コールバックの停止
    camera.stopPreview();//プレビューの停止
    camera.release();//カメラリソースの停止
    camera=null;//カメラオブジェクトの停止

}

以上でカメラに関してのプログラミングは終了です。


第5回 カメラを使ってみよう(前編)
 Step1 プロジェクトの作成とフルスクリーンの設定
 Step2 カメラ機能の実装
 Step3 タッチで撮影、保存してみよう

サンプルコード

第1回 リファレンスコード(文字列編)

第2回 リファレンスコード2(グラフィックス編)

第3回 リファレンスコード3(タッチイベント編)

第4回 リファレンスコード4(チェックボックス/ラジオグループ編)

第5回 リファレンスコード5(スピナー編)

第6回 リファレンスコード6(サウンド/ムービー編)

第7回 リファレンスコード7(トースト編)

第8回 リファレンスコード8(Google Maps API利用編)

第9回 リファレンスコード9(SQLite編)

第10回 リファレンスコード10(音声認識編)

第11回 リファレンスコード11(日付/時刻ダイアログ編)

第12回 リファレンスコード12(Bluetooth編)