2011年9月12日月曜日

Android端末のカメラのプレビューを表示する

このエントリーをはてなブックマークに追加
Android端末のカメラを起動してプレビューを表示するまでの処理についてまとめました。カメラを利用するための第一歩となるサンプルコードです。



AndroidManifest.xml
カメラを使うために次のパーミッションを指定します。
<uses-permission android:name="android.permission.CAMERA" />

また、activityの属性のandroid:screenOrientation="landscape"を指定します。どうやらカメラは横向き専用なため、この属性を指定しないと90度回転した表示となるようです。
<activity android:label="@string/app_name" android:name=".CameraSample" android:screenorientation="landscape">

サンプルコード
package sgl.example.camera;

import java.io.IOException;
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;

public class CameraSample extends Activity{

     private final String TAG = "CameraSample";
     private SurfaceView cameraView;
     SurfaceHolder holder;
     Camera camera;

     private SurfaceHolder.Callback surfaceHolderCallback = new SurfaceHolder.Callback() {

          public void surfaceCreated(SurfaceHolder holder) {
               camera = Camera.open();
               try {
                    camera.setPreviewDisplay(holder);
               } catch (IOException e) {
                    e.printStackTrace();
               }
          }

          public void surfaceChanged(SurfaceHolder holder, int format, int width,
                    int height) {
               camera.startPreview();
          }

          public void surfaceDestroyed(SurfaceHolder holder) {
               camera.stopPreview();
               camera.release();
               camera = null;
          }
     };

     @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        cameraView = new SurfaceView(this);

        SurfaceHolder holder = cameraView.getHolder();
        holder.addCallback(surfaceHolderCallback);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        setContentView(cameraView);
    }
}

SurfaceViewにカメラのプレビューを表示します。SurfaceViewのコールバック関数にはそれぞれSurfaceViewの生成時、構造的な変化時、破棄時の処理をコーディングします。

surfaceCreate
SurfaceViewが生成されたタイミングでカメラを起動します。

surfaceChanged
surfaceCreateメソッドの後に少なくとも一回は呼ばれるようです。このタイミングでカメラのプレビューを開始します。

surfaceDestroyed
SurfaceViewが破棄されたタイミングでプレビューを停止し、カメラを解放します。

そして、ActivityのonCreateが呼び出されたタイミングで、SurfaceViewのコールバック関数を登録します。


実行結果
プレビューは表示されるようになりましたが、端末画面いっぱいに表示されず、正方形(?)の枠内に表示される結果となりました。端末画面いっぱいに表示したいですが、そのための糸口はまだわからない状態です。。

0 件のコメント:

コメントを投稿