flash.externalExtensionContext ExtensionContext クラスには、ActionScript 拡張のネイティブ実装で関数を呼び出すためのインターフェイスが用意されています。flash.events:EventDispatcher ExtensionContext クラスには、ActionScript 拡張のネイティブ実装で関数を呼び出すためのインターフェイスが用意されています。このクラスは、拡張に含まれる ActionScript クラスにのみ使用できます。

AIR プロファイルのサポート:この機能は、extendedTV デバイスプロファイルを使用するアプリケーションのテレビ用 AIR でのみサポートされます。

1 つの ActionScript 拡張は次の 2 つの要素で構成されています。

  • ActionScript クラス
  • ネイティブコードネイティブコードは、デバイス上のランタイム外で実行されるコードです。例えば、C で記述されたコードはネイティブコードです。

ActionScript 拡張を作成する目的としては、AIR アプリケーションからデバイス固有の機能へのアクセスを実現することなどが考えられます。他にも、既存ネイティブコードを再利用したい場合や、ネイティブコードを使用して ActionScript コードよりも効率的に処理を実行したい場合などに ActionScript 拡張を作成することがあります。ActionScript 拡張を記述、ビルドおよびパッケージ化する方法について詳しくは、PDF ドキュメント『Adobe AIR 用 ActionScript 拡張の開発』を参照してください。

ActionScript 拡張の ActionScript 側からネイティブ側にアクセスするには、ExtensionContext クラスを使用します。まず、ExtensionContext クラスのインスタンスを作成します。これを行うには、静的メソッド ExtensionContext.createExtensionContext() を呼び出します。

ExtensionContext インスタンスの作成後、インスタンスの call() メソッドを使用してネイティブ関数を呼び出します。

ExtensionContext インスタンスの処理が完了したら、dispose() を呼び出して、関連するネイティブリソースをすべて解放します。dispose() を明示的に呼び出さないと、インスタンスの破棄時にランタイムガベージコレクターによって dispose() が呼び出されます。dispose() の明示的な呼び出しは、通常、ガベージコレクター処理の待機よりもはるかに早く発生します。

ExtensionContext インスタンスは、拡張のネイティブ実装で何らかの非同期イベントが発生するときにネイティブコードが発行する StatusEvent イベントをリッスンできます。ExtensionContext クラスは EventDispatcher から派生するので、結果としてイベントを発行できます。

拡張がデバイスにインストールされているディレクトリにアクセスするために、また、ExtensionContext クラスには静的メソッド getExtensionDirectory() が用意されています。また、拡張のネイティブ実装でデータを共有するために、プロパティ actionScriptData も用意されています。

注意:extendedDesktop プロファイルを使用する AIR アプリケーションでは、NativeProcess クラスを使用してネイティブプロセスを実行できます。

Adobe AIR 用 ActionScript 拡張の開発flash.desktop.NativeProcesscall functionName で指定されているネイティブ関数を呼び出します。functionName で指定されている名前に関連する関数はありません。 ArgumentErrorArgumentErrorメソッド dispose() は、この ExtensionContext インスタンスで呼び出し済みです。このエラーは、ネイティブ関数が無効なプロジェクト参照を返す場合にもスローされます。 IllegalOperationErrorflash.errors:IllegalOperationErrorネイティブ関数から返された値です。ネイティブ関数が値を返さない場合、または無効なオブジェクト参照を返す場合、戻り値は null です。 ObjectfunctionNameStringネイティブ実装の関数を示す名前です。この名前はネイティブ関数の実際の名前とは限りませんが、拡張のActionScript 側とネイティブ側の間で合意した名前です。 argsネイティブ関数の引数のリストです。これらの引数には、ActionScript オブジェクト(プリミティブタイプまたは ActionScript クラスオブジェクト)を指定できます。引数のタイプおよび順序は、拡張の ActionScript 側とネイティブ側の間で合意されます。 functionName で指定されているネイティブ関数を呼び出します。追加の引数があれば、ネイティブ関数に渡されます。 createExtensionContext 指定した拡張 ID およびコンテキストタイプに対して ExtensionContext インスタンスを作成します。extensionID パラメーターに null または有効でない拡張 ID が指定されています。 ArgumentErrorArgumentError新しい ExtensionContext インスタンスです。指定した extensionID 値の拡張を使用できない場合、null を返します。 flash.external:ExtensionContextextensionIDString拡張の拡張 ID です。この ID は、拡張記述子ファイルの id エレメントと同じ値です。アプリケーション開発者は、アプリケーション記述子ファイルの extensionID エレメントでもこの値を使用します。すべての拡張は、単一のグローバル名前空間を共有します。そのため、名前の競合を回避するには、拡張 ID の逆 DNS 表記法を使用します。 contextTypeString拡張のコンテキストタイプです。コンテキストタイプに応じて、ネイティブ実装は異なる初期化を実行できます。例えば、ActionScript 側が呼び出すことができる、別の使用可能なネイティブ関数セットを指定するネイティブ実装もあります。コンテキストタイプの値は、拡張の ActionScript 側とネイティブ側の間で合意した任意の文字列です。多くの場合、簡易な拡張では異なるコンテキストタイプを使用しません。このような場合、contextType 値に空の文字 "" または null を渡します。 指定した拡張 ID およびコンテキストタイプに対して ExtensionContext インスタンスを作成します。 dispose この ExtensionContext インスタンスを破棄します。 この ExtensionContext インスタンスを破棄します。

ランタイムからネイティブ実装に通知され、関連するネイティブリソースがすべて解放されます。dispose() の呼び出し後は、コードから call() メソッドを呼び出すことや、actionScriptData プロパティを取得または設定することはできなくなります。

getExtensionDirectory 拡張がデバイスにインストールされているディレクトリを返します。ディレクトリが存在しません。最も可能性が高い原因として、指定した extensionID が有効ではない可能性があります。 IOErrorflash.errors:IOError拡張がインストールされているディレクトリの File インスタンスです。 flash.filesystem:FileextensionIDString拡張の拡張 ID です。この ID は、createExtensionContext()extensionID パラメーターと同じ値です。 拡張がデバイスにインストールされているディレクトリを返します。

拡張には、拡張の ActionScript コードからアクセスする画像などのリソースが含まれることがあります。また、コードには、拡張記述子ファイルで使用できる情報が必要な場合もあります(拡張のバージョン番号など)。このメソッドを使用して、拡張のベースディレクトリにアクセスできます。

デバイスの拡張の場所にかかわらず、常に拡張のファイルは、拡張のベースディレクトリに相対して同じ場所にあります。このメソッドが返す File インスタンスを使用して、拡張に含まれる特定のファイルを特定し、操作できます。

actionScriptData このコンテキストに関連する ActionScript オブジェクトです(存在する場合)。Objectメソッド dispose() は、この ExtensionContext インスタンスで呼び出し済みです。 IllegalOperationErrorflash.errors:IllegalOperationError このコンテキストに関連する ActionScript オブジェクトです(存在する場合)。

任意の ActionScript オブジェクトを ExtensionContext インスタンスに関連付けることができます。また、ネイティブ実装は、この ActionScript オブジェクトを取得および設定できます。そのため、actionScriptData を使用して、拡張の ActionScript 側とネイティブ側でデータを共有できます。

また、actionScriptData の値を null に設定できます。

ExternalInterface ExternalInterface クラスは、ActionScript と SWF のコンテナとの間で直接通信できるようにするアプリケーションプログラミングインターフェイスです。コンテナには、JavaScript を使用した HTML ページや、Flash Player を使用して SWF ファイルを表示するデスクトップアプリケーションなどがあります。ActionScript とコンテナの間の通信を有効にします。 Object ExternalInterface クラスは、ActionScript と SWF のコンテナとの間で直接通信できるようにするアプリケーションプログラミングインターフェイスです。コンテナには、JavaScript を使用した HTML ページや、Flash Player を使用して SWF ファイルを表示するデスクトップアプリケーションなどがあります。

ExternalInterface クラスを使用すると、HTML ページの JavaScript を使用することによって、Flash ランタイムで ActionScript 関数を呼び出すことができます。ActionScript 関数は値を返すことができ、JavaScript は、呼び出しの戻り値として即座にこの値を受け取ります。

この機能は、fscommand() メソッドに代わるものです。

ExternalInterface クラスは、次のブラウザーとオペレーティングシステムの組み合わせで使用してください。

ブラウザーオペレーティングシステムオペレーティングシステムInternet Explorer 5.0 以降 Windows  Netscape 8.0 以降 Windows  Mac OS Mozilla 1.7.5 以降 Windows  Mac OS Firefox 1.0 以降 Windows  Mac OS Safari 1.3 以降  Mac OS 

Linux バージョン 9.0.31.0 以降用の Flash Player では、次のブラウザーで ExternalInterface クラスがサポートされます。

ブラウザーMozilla 1.7.x 以降Firefox 1.5.0.7 以降SeaMonkey 1.0.5 以降

ExternalInterface クラスを利用するには、ユーザーの Web ブラウザーが、一部のブラウザーによってプラグインスクリプトとして公開されている ActiveX® または NPRuntime API のいずれかをサポートしている必要があります。ブラウザーおよびオペレーティングシステムの組み合わせが上記になくても、NPRuntime API がサポートされる場合、ExternalInterface クラスがサポートされます。http://www.mozilla.org/projects/plugins/npruntime.html を参照してください。

注意:HTML ページに内に SWF ファイルを埋め込むときには、id 属性が設定されていることを確認し、id 属性および name 属性(object タグおよび embed タグ)に次の文字が含まれないようにします。

 . - + ~~ / \
 

Flash Player アプリケーションに関する注意:Flash Player バージョン 9.0.115.0 以降では、.(ピリオド)文字を id 属性内および name 属性内で使用できます。

Flash Player アプリケーションに関する注意:ブラウザーで実行される Flash Player 10 以降では、このクラスをプログラムで使用してポップアップウィンドウを開く方法は有効でない場合があります。ブラウザー(およびブラウザーの設定)によってはポップアップウィンドウがブロックされる場合があり、すべてのポップアップウィンドウが表示される保証はありません。ただし、ユーザー操作の直接の結果として実行されるコード(マウスのクリックやキー入力イベントのイベントハンドラーなど)に限っては、このクラスを使用してポップアップウィンドウを開く方法が有効です。

ActionScript から、HTML ページに対して次のことを実行できます。

  • 任意の JavaScript 関数を呼び出す
  • 引数の数を名前と共に渡す
  • ブール(Boolean)、数値(Number)、ストリング(String)などの各種データ型を渡す
  • JavaScript 関数からの戻り値を受け取る

HTML ページの JavaScript から、次のことを実行できます。

  • ActionScript 関数を呼び出す
  • 標準の関数呼び出しの表記法を使用して、引数を渡す
  • JavaScript 関数に値を戻す

Flash Player アプリケーションに関する注意:Flash Player は現在、HTML フォームに埋め込まれた SWF ファイルをサポートしていません。

AIR アプリケーションに関する注意:Adobe AIR では、ExternalInterface クラスを使用して、HTMLLoader コントロールに読み込まれた HTML ページの JavaScript とその HTML ページに埋め込まれた SWF コンテンツの ActionScript との間で通信できます。

次の例では、Flash Player および HTML コンテナ間でデータを送信する方法を示します。 package { import flash.display.Sprite; import flash.events.*; import flash.external.ExternalInterface; import flash.text.TextField; import flash.utils.Timer; import flash.text.TextFieldType; import flash.text.TextFieldAutoSize; public class ExternalInterfaceExample extends Sprite { private var input:TextField; private var output:TextField; private var sendBtn:Sprite; public function ExternalInterfaceExample() { input = new TextField(); input.type = TextFieldType.INPUT; input.background = true; input.border = true; input.width = 350; input.height = 18; addChild(input); sendBtn = new Sprite(); sendBtn.mouseEnabled = true; sendBtn.x = input.width + 10; sendBtn.graphics.beginFill(0xCCCCCC); sendBtn.graphics.drawRoundRect(0, 0, 80, 18, 10, 10); sendBtn.graphics.endFill(); sendBtn.addEventListener(MouseEvent.CLICK, clickHandler); addChild(sendBtn); output = new TextField(); output.y = 25; output.width = 450; output.height = 325; output.multiline = true; output.wordWrap = true; output.border = true; output.text = "Initializing...\n"; addChild(output); if (ExternalInterface.available) { try { output.appendText("Adding callback...\n"); ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript); if (checkJavaScriptReady()) { output.appendText("JavaScript is ready.\n"); } else { output.appendText("JavaScript is not ready, creating timer.\n"); var readyTimer:Timer = new Timer(100, 0); readyTimer.addEventListener(TimerEvent.TIMER, timerHandler); readyTimer.start(); } } catch (error:SecurityError) { output.appendText("A SecurityError occurred: " + error.message + "\n"); } catch (error:Error) { output.appendText("An Error occurred: " + error.message + "\n"); } } else { output.appendText("External interface is not available for this container."); } } private function receivedFromJavaScript(value:String):void { output.appendText("JavaScript says: " + value + "\n"); } private function checkJavaScriptReady():Boolean { var isReady:Boolean = ExternalInterface.call("isReady"); return isReady; } private function timerHandler(event:TimerEvent):void { output.appendText("Checking JavaScript status...\n"); var isReady:Boolean = checkJavaScriptReady(); if (isReady) { output.appendText("JavaScript is ready.\n"); Timer(event.target).stop(); } } private function clickHandler(event:MouseEvent):void { if (ExternalInterface.available) { ExternalInterface.call("sendToJavaScript", input.text); } } } } 上記の ActionScript コードをテストするには、次の HTML テンプレートを使用して、生成された SWF ファイルを埋め込みます。 <!-- saved from url=(0014)about:internet --> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ExternalInterfaceExample</title> <script language="JavaScript"> var jsReady = false; function isReady() { return jsReady; } function pageInit() { jsReady = true; document.forms["form1"].output.value += "\n" + "JavaScript is ready.\n"; } function thisMovie(movieName) { if (navigator.appName.indexOf("Microsoft") != -1) { return window[movieName]; } else { return document[movieName]; } } function sendToActionScript(value) { thisMovie("ExternalInterfaceExample").sendToActionScript(value); } function sendToJavaScript(value) { document.forms["form1"].output.value += "ActionScript says: " + value + "\n"; } </script> </head> <body onload="pageInit();"> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="ExternalInterfaceExample" width="500" height="375" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"> <param name="movie" value="ExternalInterfaceExample.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#869ca7" /> <param name="allowScriptAccess" value="sameDomain" /> <embed src="ExternalInterfaceExample.swf" quality="high" bgcolor="#869ca7" width="500" height="375" name="ExternalInterfaceExample" align="middle" play="true" loop="false" quality="high" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> </embed> </object> <form name="form1" onsubmit="return false;"> <input type="text" name="input" value="" /> <input type="button" value="Send" onclick="sendToActionScript(this.form.input.value);" /><br /> <textarea cols="60" rows="20" name="output" readonly="true">Initializing...</textarea> </form> </body> </html>
fscommand()addCallback ActionScript メソッドをコンテナから呼び出し可能なものとして登録します。コンテナが着信コールをサポートしていません。着信コールは Windows 用の Internet Explorer、Mozilla 1.7.5 以降、Firefox 1.0 以降などの NPRuntime API を使用するブラウザーでのみサポートされます。 ErrorError指定された名前を使用したコールバックが、アクセスしていない Sandbox 内で既に ActionScript によって追加されています。このコールバックを上書きできません。この問題を回避するには、addCallback() メソッドの呼び出し元の ActionScript を書き換えて、このスクリプトから Security.allowDomain() メソッドも呼び出すようにします。 SecurityErrorSecurityErrorコンテナ環境がセキュリティサンドボックスに属しているために、呼び出し側のコードにアクセス権がありません。この問題を修正するには、次の手順に従います。
  1. HTML ページに埋め込む SWF ファイルの object タグの中で次のパラメーターを設定します。

    <param name="allowScriptAccess" value="always" />

  2. SWF ファイルで、次の ActionScript を追加します。

    flash.system.Security.allowDomain( sourceDomain )

SecurityErrorSecurityError
functionNameStringコンテナが関数を呼び出すことができる名前です。 closureFunction呼び出す関数閉包です。これは独立した関数にすることも、オブジェクトインスタンスのメソッドを参照するメソッド閉包とすることもできます。メソッドクロージャを渡すことにより、コールバックを特定のオブジェクトインスタンスのメソッドに指定できます。

注意:既存のコールバック関数に対して、closure 値に null を指定して addCallback() を繰り返し実行すると、コールバックが削除されます。

ActionScript メソッドをコンテナから呼び出し可能なものとして登録します。addCallBack() の呼び出しが成功すると、プレーヤー内に登録されている関数をコンテナ内の JavaScript や ActiveX から呼び出すことができます。

注意:ブラウザーで実行されるローカルコンテンツでは、SWF ファイルとその埋め込み先の Web ページが local-trusted セキュリティサンドボックス内にある場合にのみ、ExternalInterface.addCallback() メソッドの呼び出しが機能します。詳細については、Flash Player デベロッパーセンターのトピック:セキュリティを参照してください。

flash.system.Security.allowDomain()
call SWF コンテナで公開されている関数を呼び出し、必要に応じて引数を渡します。コンテナが送信コールをサポートしていません。送信コールは Windows 用の Internet Explorer、Mozilla 1.7.5 以降、Firefox 1.0 以降などの NPRuntime API を使用するブラウザーでのみサポートされます。 ErrorErrorコンテナ環境がセキュリティサンドボックスに属しているために、呼び出し側のコードにアクセス権がありません。この問題を修正するには、次の手順に従います。
  1. HTML ページに埋め込む SWF ファイルの object タグの中で次のパラメーターを設定します。

    <param name="allowScriptAccess" value="always" />

  2. SWF ファイルで、次の ActionScript を追加します。

    flash.system.Security.allowDomain( sourceDomain )

SecurityErrorSecurityError
コンテナから受け取った応答です。呼び出しに失敗した場合は、null が返され、エラーがスローされます。失敗原因としては、コンテナに該当する関数が存在しない場合、インターフェイスが利用できない場合、再帰が発生した場合(Netscape ブラウザーまたは Opera ブラウザーの場合)、セキュリティ上の問題がある場合などがあります。 functionNameStringコンテナ内にある呼び出し先関数の英数字の名前です。英数字の関数名を使用すると、ランタイムエラー(エラー 2155)が発生します。try..catch ブロックを使用して、このエラーを処理できます。 argumentsコンテナ内の関数に渡されるパラメーターです。任意のパラメーターを指定することができ、複数のパラメーターを指定する場合はカンマで区切ります。パラメーターには任意の ActionScript データ型を使用できます。呼び出し先が JavaScript 関数である場合、ActionScript のデータ型は JavaScript のデータ型に自動的に変換されます。呼び出し先が他の ActiveX コンテナである場合、パラメーターは要求メッセージの中にエンコードされます。 コンテナ内の関数を呼び出します。
SWF コンテナで公開されている関数を呼び出し、必要に応じて引数を渡します。関数が利用できない場合は null を返します。それ以外の場合は、関数の戻り値を返します。再帰は、Opera ブラウザーまたは Netscape ブラウザーでは許可されていません。これらのブラウザーでは、再帰呼び出しで null 応答が発生します。Internet Explorer ブラウザーおよび Firefox ブラウザーでは、再帰がサポートされています。

コンテナが HTML ページである場合、このメソッドは script エレメントに囲まれた JavaScript 関数を呼び出します。

コンテナが別の ActiveX コンテナの場合、このメソッドは、指定された名前で FlashCall ActiveX イベントを送出し、そのイベントはコンテナによって処理されます。

コンテナが Netscape プラグインをホストしている場合、新しい NPRuntime インターフェイス用のカスタムサポートを記述するか、HTML コントロールを埋め込んだ後にそのコントロール内にプレーヤーを埋め込むことができます。HTML コントロールを埋め込んだ場合、ネイティブコンテナアプリケーションに対する JavaScript インターフェイスを通じてプレーヤーと通信できます。

注意:ブラウザーで実行されるローカルコンテンツでは、SWF ファイルとその埋め込み先の Web ページ(存在する場合)が local-trusted セキュリティサンドボックス内にある場合にのみ、ExternalInterface.call() メソッドの呼び出しが許可されます。SWF ファイルがこのメソッドを使用しないようにすることもできます。その場合は、SWF コンテンツを含んでいる HTML ページに object タグおよび embed タグの allowNetworking パラメーターを設定します。詳細については、Flash Player デベロッパーセンターのトピック:セキュリティを参照してください。

Flash Player アプリケーションに関する注意:Flash Player 10 および Flash Player 9 Update 5 では、ポップアップブロッカーが有効になっている場合、一部の Web ブラウザーでこのメソッドが制限されます。このシナリオでは、このメソッドの呼び出しはマウスのクリックやキー入力などのユーザーイベントに応じて、イベントハンドラーで呼び出した場合にのみ成功します。

次の例では、ExternalInterface クラス(flash.external.ExternalInterface)を使用して、Flash Player から HTML コンテナにストリングを送信し、そのストリングを JavaScript の alert() 関数を使用して表示する方法を示します。ActionScriptExamples.com で作成された例。 // // Requires: // - A Flash Professional Label component on the Stage with an instance name of "lbl". // - A Flash Professional Button component on the Stage with an instance name of "button". // var xmlResponse:String = "<invoke name=\"isReady\" returntype=\"xml\"><arguments><number>1</number><number>" + stage.stageWidth + "</number><number>" + stage.stageHeight + "</number></arguments></invoke>"; lbl.text = "ExternalInterface.available: " + ExternalInterface.available; lbl.width = 200; button.enabled = ExternalInterface.available; button.addEventListener(MouseEvent.CLICK, button_click); function button_click(evt:MouseEvent):void { ExternalInterface.call("alert", xmlResponse); }
marshallExceptions 外部インターフェイスから、ActionScript の例外を現在のブラウザーに渡したり、JavaScript の例外をプレーヤーに渡したりする必要があるかどうかを示します。falseBooleanActionScript と JavaScript との間で例外を渡します。 外部インターフェイスから、ActionScript の例外を現在のブラウザーに渡したり、JavaScript の例外をプレーヤーに渡したりする必要があるかどうかを示します。ActionScript で JavaScript 例外をキャッチし、JavaScript で ActionScript 例外をキャッチするには、このプロパティを明示的に true に設定する必要があります。 次の例では、ActionScript 関数を作成し、addCallback() メソッドを使用して、埋め込み先のブラウザーと共にその関数を登録します。新しい関数は、ブラウザーで実行される JavaScript コードでキャッチできるように、例外をスローします。この例には、try..catch ステートメントも含まれており、throwit() 関数が呼び出されたときにブラウザーからスローされるすべての例外をキャッチします。 package { import flash.external.* import flash.net.*; import flash.display.*; import flash.system.System; public class ext_test extends Sprite { function ext_test():void { ExternalInterface.marshallExceptions = true; ExternalInterface.addCallback("g", g); try { ExternalInterface.call("throwit"); } catch(e:Error) { trace(e) } } function g() { throw new Error("exception from actionscript!!!!") } } } addCallBack()try..catch..finally ステートメントavailable この Player が外部インターフェイスを備えたコンテナに含まれているかどうかを示します。Booleanプレーヤーが外部インターフェイスを備えたコンテナに含まれているかどうかを示します。 この Player が外部インターフェイスを備えたコンテナに含まれているかどうかを示します。外部インターフェイスが利用できる場合、このプロパティは true になります。利用できない場合には false になります。

注意:HTML で外部 API を使用する場合、JavaScript メソッドを呼び出そうとする前に、HTML のロードが完了していることを必ず確認する必要があります。

次の例では、available プロパティを使用して、外部インターフェイスを備えたコンテナ内に Player が含まれているかどうかを確認します。 package { import flash.text.TextField; import flash.display.MovieClip; import flash.external.ExternalInterface; public class extint_test extends MovieClip { public function extint_test() { var isAvailable:Boolean = ExternalInterface.available; var availTxt:TextField = new TextField(); availTxt.text = isAvailable.toString(); addChild(availTxt); } } }
objectID Internet Explorer の場合は object タグの id 属性を返し、Netscape の場合は embed タグの name 属性を返します。String Internet Explorer の場合は object タグの id 属性を返し、Netscape の場合は embed タグの name 属性を返します。