PhoneGapでWindows PhoneのAPIを呼び出す仕組み
前回の記事でPhoneGapはWebBrowserコントロール上で動いていることを説明しました。今回はWebBrowserコントロール上からWindows PhoneのAPIを呼び出す方法を見てみたいと思います。
仕組み(JavaScript --> Silverlight)
WebBrowserコントロールにはJavaScriptからSilverlightに文字列を渡す仕組みが存在します。JavaScript側でwindows.external.notify(...)を呼び出すと、Silverlight側でWebBrowserコントロールのScriptNotifyイベントが起こり、そのときにwindows.external.notifyの引数に渡された文字列がScriptNotifyに渡ってきます。
windows.external.notify("文字列") // JavaScript ↓ WebBrowser.ScriptNotify(object sender, NotifyEventArgs e) // Silverlight
PhoneGapではこの仕組みを利用し、notifyに渡す引数の文字列にルールを決めることで*1、Silverlight側でその文字列を受け取り解析しWindows PhoneのAPIにマッピングします。
参考:WebBrowser.ScriptNotify イベント
サンプル
それではカメラを呼び出す(PhotoChooserTask)例を見てみましょう。
ボタンがクリックされたらカメラのAPIを呼び出すことでカメラを表示します。
<button onclick="buttonClick();">ボタン</button>
function buttonClick() { navigator.camera.getPicture(successCallback, failureCallback, { quality: 50 }); }
その他のPhoneGapのAPIの一覧はこちらにあります。API Reference
また各APIがWindows Phoneに対応しているかを知るには[Supported Platforms]の項目を見てください。Windows Phoneと書かれていれば利用できます。
Silverlight --> JavaScript
これまではJavaScript→Silverlightの呼び出しですが、それとは逆にSilverlight→JavaScriptも呼び出すことができます。それがWebBrowserコントロールのInvoleScriptメソッドです。*2
先ほどのbuttonClick関数を呼び出すには、Silverlight側で次のようにコードを書きます。
GapBrowser.InvokeScript("buttonClick", new string[]{});
これでJavaScriptとSilverlightで相互に連携することができます。
PhoneGapではまだすべてのAPIが実装されているわけではないので必要なAPIが存在しないこともあります。そのようなときでも足りないAPIなどがあればGitHubからソースコードを取得して自分でAPIを追加することも可能です。