このマスターシリーズでは、Adobe AIR 2.6で導入されたデスクトップおよびモバイルプラットフォームの新機能について解説します。

前回はAdobe AIR 2.6以降で導入されたモバイルアプリケーション向けAPIとして、マイクやカメラ関連のAPIを取り上げました。本記事では、その他のモバイルアプリケーション向けAPIを解説します。

新機能について

今回は、下記のモバイルアプリケーション向けAPIについて取り上げます。

  • StageWebView
  • 仮想キーボード

また、最後にネットワーク機能のサポート状況についても触れておきます。

StageWebView

StageWebViewは、モバイルアプリケーション内でブラウジング機能を利用するために追加されたクラスです(デスクトップアプリケショーンでは、HTMLLoaderクラスを使用します)。HTMLコンテンツの表示には、モバイル端末の各システムに用意されているブラウザーを使用します。図1は、StageWebViewの使用例です(サンプル:04_Sample)。

StageWebViewの配置

StageWebViewは、その名の通り、親となるステージをstageプロパティにセットして表示します。オブジェクトの表示領域は、viewPortプロパティにRectangleをセットします。なお、DisplayObjectではないため、他の表示オブジェクトとのZオーダーを制御することができず、常に手前に表示されます。

var stageWebView = new StageWebView(); stageWebView.stage = stage; stageWebView.viewPort = new Rectangle(0, y, stage.stageWidth, stage.stageHeight);

一時的に非表示にしたい時は、viewPortに空のRectangleをセットします。

stageWebView.viewPort = new Rectangle();

コンテンツのロード

StageWebViewオブジェクトへコンテンツをロードするには、loadURLメソッドやloadStringメソッドを使用します。

loadURLメソッドは、URLで指定したリソースを読み込みます。「file:スキーマ」でアプリケーション内のファイルを読み込むことも可能です。

stageWebView.loadURL("http://www.adobe.com/");

loadStringメソッドは、HTML文字列とMIMEタイプを渡して、ロードすることができます。

var htmlString:String = "<!DOCTYPE HTML>" + "<html><body>" + "<p>Test.</p>" + "</body></html>"; stageWebView.loadString(htmlString, "text/html");

ブラウザーとしての機能とその操作

StageWebViewには、一般的な簡易ブラウザーを作るための機能が一通り用意されています。

StageWebViewに用意されているブラウザー機能
ブラウザーの機能 StageWebViewのプロパティやメソッド
現在のページのURL locationプロパティで取得します。
現在のページのタイトル titleプロパティで取得します。
ページを戻る historyBackメソッドで履歴上のページを戻ります。前のページが履歴にあるかどうかは、isHistoryBackEnabledプロパティで取得できます。
ページを進める historyForwardメソッドで履歴上のページを進めます。次のページが履歴にあるかどうかは、isHistoryForwardEnabledプロパティで取得できます。
ページの再読み込み reloadメソッドで現在のページを更新します。
読み込みの中止 stopメソッドでロードを中止します。

ページ遷移のイベント検出

StageWebViewでは、ページ遷移時に下記のイベントが発生します。

ページ遷移に関連したイベント
イベント 内容
LOCATION_CHANGING コンテンツ内での操作で発生したページ遷移の直前に、LocationChangeEventオブジェクトのLOCATION_CHANGINGイベントが発生します。この時点でLocationChangeEventのオブジェクトのpreventDefaultメソッドを呼ぶことで、ページ遷移をキャンセルすることができます。
LOCATION_CHANGE 外部からの操作によるページ遷移、コンテンツ内での操作によるページ遷移、どちらの場合もページ遷移後(locationプロパティの変更後)にLOCATION_CHANGEイベントが発生します。
COMPLETE ページの読み込み完了時には、EventオブジェクトのCOMPLETEイベントが発生します。
ERROR エラー発生時は、ErrorEventオブジェクトのERRORイベントが発生します。

Androidにおけるデバイス使用許可の設定

Androidの場合、リモートURLを読み込めるようにするには、アプリケーション記述子ファイルにてINTERNET権限を設定する必要があります。下記のように、android要素のmanifestAddtions要素のmanifest要素内に、user-permission要素としてandroid:name属性にandroid.permission.INTERNETを設定します。

<android> <manifestAdditions><![CDATA[ <manifest android:installLocation="auto"> (…省略…) <uses-permission android:name="android.permission.INTERNET"/> </manifest> ]]></manifestAdditions> </android>

なお、iOSではこの設定は必要ありません。

StageWebViewの使用可能の確認

StageWebViewを使用可能かどうかは、StageWebViewクラスのisSupportedプロパティの真偽値で判断します。ただし、Android、iOSともに通常のデバイスはサポートしているため、この値をあえて確認することは少ないと思います。

コンテンツのビットマップデータのキャプチャ

前述の通り、サンプル04_Sampleではコンテンツをキャプチャしてカメラロールに追加する機能も実装してあります。StageWebViewに現在表示されているコンテンツをビットマップデータにキャプチャしており、このキャプチャはステージのviewPortプロパティに指定されている領域に対して行われます。この領域が設定されていないと、ビットマップデータに何も描画されないので注意してください。

var bmpdata:BitmapData = new BitmapData(stageWebView.viewPort.width, stageWebView.viewPort.height); stageWebView.drawViewPortToBitmapData(bmpdata);

コンテンツへのアクセス

StageWebViewには、ExternalInterfaceのようなJavaScriptを利用したHTMLコンテンツとActionScriptプログラムが直接やりとりできる仕組みはありません。ただし、loadURLメソッドでは「javascript:スキーム」に対応しているため、ブラウザーのブックマークレットのような方法で擬似的にHTMLコンテンツを外部から操作することも可能です。

StageWebViewの詳細な動作と破棄

前述の通り、モバイルでは各システムのブラウザーが利用されます。そのため、メソッドやイベントの動きには最終的に各システムのブラウザーとそのバージョンが影響します。

また、メモリを効率的に利用するためには、不要な時にはStageWebViewを破棄するようにしましょう。StageWebViewの破棄を明示的に行うには、disposeメソッドを利用します。

仮想キーボード

Adobe AIR 2.6から、モバイルデバイスの仮想キーボードを制御することが可能となりました。サンプル04_Sampleでは、画面下のテキストフィールドにフォーカスを当てると仮想キーボードが表示されます。

仮想キーボードの表示/非表示の検出

テキストフィールドに対してSoftKeyboardEventオブジェクトのイベントをハンドルすることで、仮想キーボードのアクティブ化などのタイミングを検知することができます。

仮想キーボードが表示されようとしているタイミングでSOFT_KEYBOARD_ACTIVATINGイベントが発生します。このイベント発生時にSoftKeyboardEventオブジェクトのpreventDefaultメソッドを呼ぶことで、仮想キーボードの表示を抑止できます。

仮想キーボードが表示されたタイミングでSOFT_KEYBOARD_ACTIVATEイベントが発生します。このイベントは、リサイズイベントのように、仮想キーボードの領域が変化する度に発生します(例えば、変換候補の表示/非表示による領域の変化など)。

また、仮想キーボードの非表示のタイミングでSOFT_KEYBOARD_DEACTIVATEイベントが発生します。

フォーカスによる問題

デバイスを回転して仮想キーボードが閉じた後、再びデバイスを回転すると、仮想キーボードが閉じているにも関わらずさらにSOFT_KEYBOARD_DEACTIVATEイベントが発生することがあります。これはフォーカスがテキストフィールドに残っているためです。フォーカスを次のように明示的に外すことで回避できます。

this.stage.focus = null;

また、仮想キーボードを表示した状態でStageWebViewのコンテンツ領域をタップしても、フォーカスがテキストフィールドに残っていると仮想キーボードが閉じません。この問題も、StageWebViewのFocusEvent.FOCUS_INイベントをハンドルし、上記と同じく明示的にフォーカスを外すことで回避できます。

テキストフィールドにフォーカスがあると、「仮想キーボードを表示する」状態となるので、必要に応じてフォーカスを外しましょう

テキストフィールド以外への仮想キーボードの適用

Androidではテキストフィールド以外でも、InteractiveObjectを継承するオブジェクトのneedsSoftKeyboardプロパティをtrueにセットすることで、仮想キーボードの動作を適用することができます。このオブジェクトに対して、仮想キーボードを表示させたい時は、requestSoftKeyboardメソッドを使います。

仮想キーボードの表示による画面領域の自動調整

softkeyboardBehaviorはテキストフィールドにフォーカスが当たったとき、仮想キーボードによってそのテキストフィールドが隠れないように自動調整するかどうかを指定します。デフォルト値はpanです。画面を上へパンすることで、テキストフィールドが画面の上部に維持されます。値をnoneにしたときは、そのままでは場所によって、テキストフィールドが隠れたままになってしまいます。

panに設定していても、自動調整が上手く働かない場合があります。その場合はnoneにしておき、stageのsoftKeyboardRectプロパティで仮想キーボードの領域を取得し、この値に合わせてテキストフィールドを移動させるといったロジックで調整することができます。

<softKeyboardBehavior>none</softKeyboardBehavior>

ネットワーク機能のサポート状況

デスクトップ版のAdobe AIR 2.0で、様々なネットワーク機能の強化が行われました。モバイルでの対応はどうなっているのでしょうか。ServerSocket/SecureSocket/DatagramSocket、それぞれのクラスのisSupportedプロパティで確認してみたところ、残念ながら現状ではAndroidとiOSいずれにおいてもfalseとなり、利用できませんでした。今後のバージョンアップでサポートされることを期待したいと思います。

なお、基本的なSocketクラスを使用することはもちろん可能です。

おわりに

Adobe AIR 2.6以降に導入されたモバイル向けAPIについて紹介しました。StageWebView、仮想キーボードともにiOSやAndroidの各端末によって、細かな動作に違いがあります。これらの機能を利用する際は、各端末での動作を確かめながら行うとよいでしょう。

計4回に渡ってお送りしてきたAdobe AIR 2.6マスターシリーズも、今回で最終回です。既にAdobe AIR 2.7も登場し、iOSでの動作速度が向上するなど、進化は続いています。さらにマルチデバイスに展開するAdobe AIRで、多様なアプリケーションの開発を楽しんでください。

関連記事