libro
www.tuyano.com
Google androidプログラミング入門

ハードウェア・アクセス (4/7)

作成:2010-06-01 19:00
更新:2011-07-08 15:45

■カメラの映像を表示する

扱えたら楽しいハードウェア機能といったら、なんといっても「カメラ」でしょう。これは、映像を表示するためのViewクラスを定義するなどしなければいけないので少々面倒ですね。

が、実はAndroid SDKには、カメラの映像を利用するサンプルが用意されているので、それをそのまま利用すれば、とりあえずカメラを利用するための基本的な仕組みはすぐに作れるのです。以下のフォルダを探してみてください。
SDKのフォルダ/samples/android-XXX/ApiDemos/src/com/example/android/apis/graphics
ここにある「CameraPreview.java」というのが、カメラの映像を利用する簡単なサンプルです。では、これを使ってみましょう。

カメラを利用するには、ソースコード以外にいくつか必要な設定があります。まず、AndroidManifest.xmlを開き、<manifest>タグ内に以下のタグを追記してください。
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />
これは、カメラ関係の機能を利用できるようにするためのものです。また、ここに記述されている<activity>タグに、以下の属性を追加してください。
android:screenOrientation="landscape"
これはAndroidの表示をランドスケープ(風景、要するに横にした表示)にするものです。これでとりあえずマニフェストファイルの設定はOKです。

では、SampleApp.javaのソースコードを以下のように書き換えましょう。そして、実機をUSB接続し、実機で実行してみてください。カメラを使いますから、エミュレータで動作確認しようなんて考えても無駄ですよ。

このサンプルは、ただカメラからの映像を無補正で画面に表示するだけのものです。映像をカメラのようにキャプチャーするとか、なにか操作をするとか、全くありません。とりあえず「こうやればカメラの映像を表示できる」という、カメラ操作の基本のサンプルと考えましょう。

※AndroidManifest.xmlのパーミッション設定

カメラを利用する場合、AndroidManifest.xmlにカメラの利用を許可する設定を追加します(ただし、xperiaで確認したところ、書かなくても使えちゃうんですが……)。<manifest>内に、以下のタグを追加しておきましょう。
<uses-permission
    android:name="android.permission.CAMERA" />
(by. SYODA-Tuyano.)

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※AndroidManifest.xmlの追加
<uses-permission
	android:name="android.permission.CAMERA" />

※SampleApp.javaの修正
package jp.tuyano;

import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.*;

public class SampleApp extends Activity {
	private Preview mPreview;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		mPreview = new Preview(this);
		setContentView(mPreview);
	}

}

class Preview extends SurfaceView
		implements SurfaceHolder.Callback {
	SurfaceHolder mHolder;
	Camera mCamera;

	Preview(Context context) {
		super(context);
		mHolder = getHolder();
		mHolder.addCallback(this);
		mHolder.setType(SurfaceHolder.
				SURFACE_TYPE_PUSH_BUFFERS);
	}

	public void surfaceCreated(SurfaceHolder holder) {
		mCamera = Camera.open();
		try {
			mCamera.setPreviewDisplay(holder);
		} catch (IOException exception) {
			mCamera.release();
			mCamera = null;
		}
	}

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

	public void surfaceChanged(SurfaceHolder holder,
			int format, int w, int h) {
		Camera.Parameters parameters = 
				mCamera.getParameters();
		parameters.setPreviewSize(w, h);
		mCamera.setParameters(parameters);
		mCamera.startPreview();
	}
}

※関連コンテンツ

<< prev next >>

「Google androidプログラミング入門」に戻る