AndroidでAdobe AIR

先日Adobe AIRで動画再生する方法について書きましたが、今度はAndroid上でAIRアプリケーションを動かしてみます。

FlashDevelopを立ち上げ、[Project]-[New Project]メニューで開くダイアログボックスで、
[ActionScript 3]-[AIR Mobile AS3 App]を選んで[Name]テキストボックスに
プロジェクトの名前を適当に入力し[OK]をクリックします。ここでは名前を”movie”にすることにします。
必要なら[Create dirctory for project]のチェックを入れておきます。
[Project]ペインに作成したプロジェクトの構成要素が表示されるはずです。
“AIR_Android_readme.txt”は一読したほうがいいでしょう。
“AIR_iOS_readme.txt”ファイルが目にとまった方もいるでしょうが、
実はこのプロジェクトでiOS用のアプリケーションも開発できます。
ただし、それをiPadやiPhoneで実行するのはハードルが高いので。

とりあえずAndroidで動作できるまでやってみます。
まずは一度だけ”bat/CreateCertificate.bat”を実行しておきます。
また実行環境となるAndroid側で、Google PlayからAdobe AIRをインストールし、
[設定]アプリケーションの[アプリケーション]-[提供元不明のアプリ]をチェックしておきます。
もし使用するAndroid端末でADBドライバが提供されていれば、それをPCにインストールし、
[アプリケーション]-[開発]-[USBデバッグ]をチェックしてPCとUSB接続しておくことで、
作成したアプリケーションのAndroidへのインストールが簡単に行えます。

で、[Project]-[Build Project]メニューを実行すると”bin/movie.swf”が作成され、
“PackageApp.bat”を実行し、[1]を選択すれば”dist/movie.apk”が生成されます。
このときAndroid端末をADB接続していれば自動的にパッケージがインストールされるので、
普通のAndroidアプリケーションと同様に実行・管理することができます。
そうでなければ、”movie.apk”を適当なウェブサーバにアップロードし、
Androidのウェブブラウザからダウンロードしてインストールすることになります。
なお”PackageApp.bat”を実行した際に[3]を選択すると
AIRのライブラリが含まれたapkパッケージができあがるようです。

ちなみにメインのソースコードである”src/Main.as”はデフォルトで以下のようになっています。

package 
{
	import flash.desktop.NativeApplication;
	import flash.events.Event;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.ui.Multitouch;
	import flash.ui.MultitouchInputMode;
	
	/**
	 * ...
	 * @author ---------
	 */
	public class Main extends Sprite 
	{
		
		public function Main():void 
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			stage.addEventListener(Event.DEACTIVATE, deactivate);
			
			// touch or gesture?
			Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
			
			// entry point
			
			// new to AIR? please read *carefully* the readme.txt files!
		}
		
		private function deactivate(e:Event):void 
		{
			// auto-close
			NativeApplication.nativeApplication.exit();
		}
		
	}
	
}

とりあえず以下のようにすると動画が再生できました。

package 
{
	import flash.desktop.NativeApplication;
	import flash.events.Event;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.ui.Multitouch;
	import flash.ui.MultitouchInputMode;
	import flash.events.AsyncErrorEvent;
	import flash.events.NetStatusEvent;
	import flash.events.SecurityErrorEvent;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	
	/**
	 * ...
	 * @author ---------
	 */
	public class Main extends Sprite 
	{
		private var videoURL:String = "http://<コンテンツサーバ>/<ディレクトリ>/movie.flv";
		private var netConnection:NetConnection;
		private var stream:NetStream;
		
		public function Main():void 
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			stage.addEventListener(Event.DEACTIVATE, deactivate);
			
			// touch or gesture?
			Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
			
			// entry point
			// new to AIR? please read *carefully* the readme.txt files!
			netConnection = new NetConnection();
			netConnection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
			netConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			netConnection.connect(null);
		}
		
		private function deactivate(e:Event):void 
		{
			// auto-close
			NativeApplication.nativeApplication.exit();
		}
		
		private function netStatusHandler(event:NetStatusEvent):void
		{
			switch (event.info.code) {
				case "NetConnection.Connect.Success":
					connectStream();
					break;
				case "NetStream.Play.StreamNotFound":
					trace("Unable to locate video: " + videoURL);
					break;
				case "NetStream.Play.Stop":
					stream.play(videoURL);
					break;
			}
		}
		
		private function connectStream():void
		{
			stream = new NetStream(netConnection);
			stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
			stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
			var video:Video = new Video();
			video.attachNetStream(stream);
			stream.play(videoURL);
			addChild(video);
		}
		
		private function securityErrorHandler(event:SecurityErrorEvent):void
		{
			trace("securityErrorHandler: " + event);
		}
		
		private function asyncErrorHandler(event:AsyncErrorEvent):void
		{
			
		}
	}
	
}

しかし、ローカルファイルの再生方法はわかりません。
ネット上の情報を参考にいろいろやってみたのですができずじまいです。