AIR/Flex: 2012年9月アーカイブ

例えば、社内システムを Web アプリ化してんだけど、一部のプログラムだけはローカルマシンのリソースを使うので、それぞれのマシンに EXE ファイルとして置いてるんですわ・・・というケースはあるよね。
その時に、そのローカルマシン上のプログラムの起動も、Web アプリのメニュー上から行いたいんですわ・・・という要望もあると思う。

でも、例えば

<a href="C:\Program Files (x86)\apps\apps.exe">A業務システム起動!!</a>

なんてリンクを書いてブラウザからクリックしても(多分)EXE は起動しないよね。
したらセキュリティ的に大変なことだ。

つーことで、普通のプログラムをブラウザから起動するのはなかなか厳しいと思うんだけど、Adobe Flex の AIR アプリなら可能だ。

  1. ローカルマシン上の業務アプリ(Adobe Flex の AIR アプリ)を、allowBrowserInvocation を true にして作成。
  2. AIR アプリを起動するための Flash を作成。
  3. その Flash をセットした HTML を作成。(Flash Builder でリリースビルドのエクスポートをしたら、自動で作成されるけどね。それを自分のサイトにあったデザインに修正すれば良し)

というこれだけだ。

上記 2 で作成した Flash をブラウザに表示して、ボタン(これは Flash の作り方次第だから、文字列でも画像でもボタンでもなんでもいいんだけど)を押せばローカルマシン上で AIR アプリが起動する。

翻訳の微妙な Adobe 本家のサイトより、
http://hakuhin.jp/air/install.html Adobe AIR プログラミング講座
このサイトが非常に参考になった。

Flash 自体は、↓こんな感じで。(ホント、これは起動させるだけのものだけど(^^;)

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="1024" minHeight="720" initialize="initProc()">
    <fx:Script>

        <![CDATA[

            public var air_app_id:String = "hogehoge.app"; // アプリケーションID
            public var air_app_publish:String = "";
            public var air_swf:Object = null;

            private function initProc():void {

                var airSWFLoader:Loader = new Loader(); //Used to load the SWF
                var loaderContext:LoaderContext = new LoaderContext();  
                loaderContext.applicationDomain = ApplicationDomain.currentDomain;

                airSWFLoader.contentLoaderInfo.addEventListener(Event.INIT, onInit);
                airSWFLoader.load(new URLRequest("http://airdownload.adobe.com/air/browserapi/air.swf"),  
                    loaderContext);

            }

            private function onInit(e:Event):void {
                air_swf = e.target.content;

                air_swf.getApplicationVersion(air_app_id, air_app_publish, function(version:String):void {
                    
                    if(version == null) {
                        // アプリケーションがインストールされてない時の処理<省略>
                    }

                });

            }

            private function airAppStart():void{

                // AIR アプリケーションを起動する
                air_swf.launchApplication(air_app_id, air_app_publish);

            }

        ]]>
       
    </fx:Script>

    <s:Button x="60" y="58" label="起動" click="airAppStart()"/>
</s:Application>

詳しくは、上記のサイトや、
http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-1c6efe05128cca667e7-8000.html AIR.SWF ブラウザー API
この辺りのサイトをどうぞ。
Adobe Flex は、画像ファイルとして扱えるのは、PNG, JPEG, GIF, SVG の4種類だけ。

例えば、インターネット上の TIFF ファイルを URLLoader で取得して、それを Loader で、

bmp:Bitmap = Bitmap(event.target.content);

みたいにビットマップデータとしてロードすることは出来ない。

つーことで、今回は Perl で wrapper として動く API プログラムを作成して、AIR アプリから TIFF ファイルへのアクセスがあった場合、JPEG 画像に変換してデータを渡すことにした。

例えば、TIFF 画像を $data に読み込んだ後で、Image::Magick モジュールを使って、

use Image::Magick;

my $image = Image::Magick->new();
$image->Set(magick => 'tif');
$image->BlobToImage($data);

# 今回は、画像サイズを縮小するので、その処理も
my($width, $height)    = $image->Get('width', 'height');
$height    = int($height * ($Width(変更後の横幅) / $width));
$image->Resize(width => $Width, height => $height);

my $new_data    = $image->ImageToBlob(quality => $Quality(画質), magick => 'jpg');

こんな感じ。
これで、$new_data に TIFF から変換された JPEG 画像データがセットされるので、

my $size    = length($new_data);

print "Content-type: image/jpeg\n";
print "Content-Length: $size\n";
print "\n";
print $new_data;

で、AIR アプリ側でも問題なく画像が表示される。

Image::Magick もたまにしか使わないので、いつもメソッドやプロパティを忘れてしまうので、一応、メモ代わりに書いておこう。

このアーカイブについて

このページには、2012年9月以降に書かれたブログ記事のうちAIR/Flexカテゴリに属しているものが含まれています。

前のアーカイブはAIR/Flex: 2012年8月です。

次のアーカイブはAIR/Flex: 2013年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら