タグ : CameraUI

カメラにアクセスする2(CameraUI)

airforandroidではCameraにアクセスする方法が2種類あると以前に紹介しましたが、今回はもうひとつの方法CameraUIについて調べてみたいと思います。

CameraUIでは端末のデフォルトカメラアプリを呼び出し、MediaEventで撮影したファイルを受け取るといった処理を行ないます。
CameraとCameraUIの違いはFlash内のCameraを使うか?外部のカメラアプリ?を使うかという違いだと思いますが、それぞれ以下のように長所短所があると思います。

・Camera

長所: リアルタイムにカメラにエフェクトをかけて撮影できるなどカメラそのものに対する自由度が高い。

短所: カメラをアタッチしたvideoは負荷が高く、高解像度の静止画を保存するのはあまり向いてない。

・CameraUI

長所: 使い慣れたUIで処理の流れが高速に行える。デベロッパーがUIを作る手間が省ける。カメラアプリなので撮影時の解像度、明るさ、フォーカス、顔検出などアプリによって細かい設定が可能。

短所: 突然別アプリが立ち上がったようにみえてしまうのでUIに統一感がなくなる。カメラにアクセスできないので写真を撮るという限定的な機能に絞られてします。

低解像度でもよくてカメラへのアクセスが自由におこないたい場合はCameraを、画質へのこだわりやスムーズな処理を求める場合はCameraUIのように分けるのがベスト?ではないでしょうか。

CameraUIを呼び出す為のサンプルスクリプトは以下になります。

package
{
	//このサンプルはβ20100923版でNexusOneにて動作確認したものです。

	import flash.display.Sprite;
	import flash.media.CameraUI;
	import flash.media.MediaType;
	import flash.media.MediaPromise;
	import flash.events.MediaEvent;
	import flash.text.TextField;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;

	public class Main extends Sprite
	{
		var cameraui:CameraUI;

		public function Main()
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;

			//CameraUIを呼び出す
			callCameraUI();
		}

		//CameraUI呼び出し
		private function callCameraUI():void {
			//インスタンスを作成
			cameraui = new CameraUI();
			//CameraUI終了時のコールバック
			cameraui.addEventListener(MediaEvent.COMPLETE, onLoadImg);
			//CameraUIを静止画モードで起動
			cameraui.launch(MediaType.IMAGE);
			//CameraUIを動画モードに設定すると動画が保存され参照することもできます。
			//cameraui.launch(MediaType.VIDEO);
		}

		//撮影後の処理
		private function onLoadImg(e:MediaEvent):void {

			//MediaPromiseで受渡されたファイルの情報を取得できます。
			var mediapromise:MediaPromise = e.data;

			var txt:TextField = new TextField();
			txt.autoSize = "left";
			txt.appendText("filename : " + mediapromise.file.name + "\n");
			txt.appendText("path : " + mediapromise.file.nativePath + "\n");
			txt.appendText("size : " + mediapromise.file.size + "\n");
			txt.appendText("type : " + mediapromise.file.type + "\n");
			addChild(txt);
			//保存されたデータにアクセスする場合はCameraRollにアクセスします。
			//CameraRollの説明はまた別記事にて。
		}
 	}
}

この記事はairforandroidフォーラムのこの記事を参考にしました。