サンプルプログラム工場

AAKAKA Appで使われているプログラムのサンプルコードをそのまま公開!

サンプルプログラム工場 > android > カメラに写った映像をプレビュー表示するサンプル#tryCamera00
Google Play AAKAKAxSOFTへ

カメラに写った映像をプレビュー表示するサンプル#tryCamera00

実行ファイル(APK)やサンプル(zip)をダウンロードする
tryCamera00の実行イメージtryCamera00の実行イメージ

とにかく端末についたカメラを使って画像を取り込みたい。
カメラに写った画像をそのまま画面に表示する。
プレビューとして表示できる画像サイズがきまっているため、そのサイズに合わせたレイアウトにしないと画像データがいっぱいに伸ばされるらしくて狂った画像が表示されてしまう。
プレビューサイズとレイアウトのサイズをうまく合わせないといけない。

AndroidManifest.xmlに

<uses-permission android:name="android.permission.CAMERA"/>
<user-feature android:name="android.hardware.camera"/>

を追加しないとカメラが使えない

関連項目
 SurfaceHolder.Callback
 Camera
 getSupportedPreviewSizes
 setPreviewSize

開発環境
 Eclipse IDE バージョン: 3.7 Indigo Service Release 2
 ターゲットプラットフォーム: 2.1
 API レベル: 7
 確認端末: SC-04D GALAXY NEXUS(Android 4.0.2)

package trial.sample.trycamera00;

import java.io.IOException;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;

public class TryCamera00Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // タイトルなし
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        // カメラのプレビューを全画面で設定する
        this.setContentView(new CameraView(this));
    }
}

// ////////////////////////////////////////////////////////////
// カメラ用SurfaceView
class CameraView extends SurfaceView implements SurfaceHolder.Callback {

	private Camera mCamera; // カメラ本体
	
	// ////////////////////////////////////////////////////////////
	// コンストラクタ
	public CameraView(Context context) {
		super(context);
		// TODO 自動生成されたコンストラクター・スタブ
		SurfaceHolder holder = this.getHolder();
		// これしないと落ちるんだってさ。でもAndroid4.0.2だと落ちないんだけど
		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		// コールバックとして登録する
		holder.addCallback(this);
	}

	

	// ////////////////////////////////////////////////////////////
	// サーフェイスが作られたときに呼ばれる
	public void surfaceCreated(SurfaceHolder holder) {
		
		// カメラを開く
		this.mCamera = Camera.open();
		
		// カメラが正常に開かれた
		if (this.mCamera != null) {
			// プレビューを設定するSurfaceHolderを設定
			try {
				this.mCamera.setPreviewDisplay(holder);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	
	// ////////////////////////////////////////////////////////////
	// サーフェイスサイズが変更されたときとかに呼ばれる
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		
		// プレビューを止める
		this.mCamera.stopPreview();
		
		// カメラの情報を取り出す
		Parameters params = this.mCamera.getParameters();
		
		int tmpWidth = 0;
		int prevWidth = width;
		int prevHeight = height;


		// カメラがサポートしているプレビューイメージのサイズ
		List<Size> sizeList = params.getSupportedPreviewSizes();
		
		// カメラに設定されているサポートされているサイズを一通りチェックする
		for (Size currSize : sizeList) {
			
			// プレビューするサーフェイスサイズより大きいものは無視する
			if ((prevWidth < currSize.width) ||
					(prevHeight < currSize.height)) {
				continue;
			}
			
			// プレビューサイズの中で一番大きいものを選ぶ
			if (tmpWidth < currSize.width) {
				tmpWidth = currSize.width;
				prevWidth = currSize.width;
				prevHeight = currSize.height;
			}
			
		}
		
		// プレビューサイズをカメラのパラメータにセットする
		params.setPreviewSize(prevWidth, prevHeight);

		// 実際のプレビュー画面への拡大率を設定する
		float wScale = width / prevWidth;
		float hScale = height / prevHeight;
		
		// 画面内に収まらないといけないから拡大率は幅と高さで小さい方を採用する
		float prevScale = wScale < hScale ? wScale : hScale;
		
		// SurfaceViewのサイズをセットする
		ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
		layoutParams.width = (int)(prevWidth * prevScale);
		layoutParams.height = (int)(prevHeight * prevScale);
		

		// レイアウトのサイズを設定し直して画像サイズに一致するようにする
		// 一致させないと変な感じに画像がのびちゃう
		this.setLayoutParams(layoutParams);
		
		// カメラにプレビューの設定情報を戻してプレビューを再開する
		this.mCamera.setParameters(params);
		this.mCamera.startPreview();
		
	}
	
	// ////////////////////////////////////////////////////////////
	// サーフェイスが破棄される問いに呼ばれる
	public void surfaceDestroyed(SurfaceHolder holder) {
		
		// カメラがある
		if (this.mCamera != null) {
			// プレビューの終了処理
			this.mCamera.stopPreview();
			this.mCamera.release();
			this.mCamera = null;
		}
		
	}
	
}

サンプルプロジェクトをダウンロード APKファイルをダウンロード

, , , , , ,

AndroidアプリでクリップボードにClipboardManagerを使ってテキストを書き... Androidのエミュレーターでlocalhostに接続したい!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>