2011年12月17日土曜日

サーフェイスビューにカメラの映像をプレビュー:Android Camera



USBカメラを繋げて表示しているので、カメラを回転させたり、
カメラサイズを取得して、サーフェイスに設定したりしています。


package com.android_test;

import java.io.FileOutputStream;
import java.util.List;
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

public class AndroidTestActivity extends Activity {
 private String filePath;
 private Camera camera;

 /** 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.surfaceView1);
  SurfaceHolder holder = mySurfaceView.getHolder();
  holder.addCallback(mSurfaceListener);
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  // カメラの総数
  int numberOfCameras = Camera.getNumberOfCameras();
  Log.d("個数", String.valueOf(numberOfCameras));

  // 保存フォルダの取得
  filePath = Environment.getExternalStorageDirectory().getPath();// /mnt/sdcard
  Log.d("SDカードのパス", filePath);
 }

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

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

  public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
   // TODO Auto-generated method stub
   Log.d("サーフェイスサイズ", "w=" + String.valueOf(width) + "h=" + height);// 480x661

   camera.setDisplayOrientation(90);// カメラを回転
   Camera.Parameters parameters = camera.getParameters();
   List<Camera.Size> size = parameters.getSupportedPreviewSizes();

   Log.d("カメラのサイズ", "w=" + String.valueOf(size.get(0).width) + "h="
     + String.valueOf(size.get(0).height));// 480x640
   parameters.setPreviewSize(size.get(0).width, size.get(0).height);
   camera.setParameters(parameters);
   camera.startPreview();
  }
 };

 // ボタンが押された時の処理
 public void SetButtonOnClick(View v) {
  // camera = Camera.open(1);//カメラを開く
  // カメラ画像を取得
  camera.takePicture(null, null, mPictureListener);
 }

 // JPEGイメージ生成後に呼ばれるコールバック
 private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
   // SDカードにJPEGデータを保存する
   if (data != null) {
    FileOutputStream myFOS = null;
    try {
     myFOS = new FileOutputStream(filePath
       + "/DCIM/Camera/camera_test.jpg");
     myFOS.write(data);
     myFOS.close();
    } catch (Exception e) {
     e.printStackTrace();
    }
    camera.release();
   }
  }
 };
}


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/surfaceView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" android:layout_weight="1"/>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" android:onClick="SetButtonOnClick"/>

</LinearLayout>


カメラサイズを取得して同じ値を設定している部分は、
意味のない処理をしているかもしれません。

関連記事

0 件のコメント:

コメントを投稿