2011年8月17日水曜日

[Android]JavaScript⇔Android(Java)の連携

時々、HTML(JavaScript)とAndoroidを連携したいときがあります。そんなときは、WebViewを使えば、簡単に連携することができます。連携方法は以下の通り。

1.JavaScript→Android
 AndroidのWebViewには、addJavascriptInterfaceというメソッドがあり、ここに登録することで、Javaのメソッドを呼び出すことができます。うーん簡単。
 しかし引数に渡せるのは、比較的プリミティブなものだけ。というルールがある(配列とか結構ダメ)。
 とはいえ、引数も戻り値も指定できる。

2.Android→JavaScript
 WebView#loadUrlメソッドを使って、JavaScriptを呼び出す。
webView.loadUrl("javascript:testFunction('abc');");
 コレで、testFunctionというスクリプトを引数'abc'で呼び出したことになる。
 しかし、戻り値をもらうインタフェースがない...。

3.JavaScriptからどうやって戻り値をもらう?
 手っ取り早いのはコールバック形式。
 事前準備として、WebView#addJavascriptInterfaceで、コールバック(値を保持する変数のセッターとか)を登録
 webView.loadUrlでJavaScriptを呼び出すこの時、addJavascriptInterfaceで登録したメソッドを呼び出す
 メソッド呼び出しが終わったら、addJavascriptInterfaceで登録したインタフェースから値を取り出す
 登録したクラスより値を取り出すことで、結果が取得できる。

 ・・・結果の受け取りだけですが...エレガントじゃないですが、いたし方がない...。

2 件のコメント:

匿名 さんのコメント...

はじめまして。
3がうまく動かない(ハングする)ん
ですが何かほかにしなければいけないことが
あるんでしょうか?

やっていることは
addJavascriptInterfaceでjavaクラスを
登録。javascriptでの名前はクラス名と同じに。
loadUrl("javascript:クラス.メソッド");
で呼び出し。
です。よろしくお願い致します。

GENZ0 さんのコメント...

匿名さんへ

連絡遅くなりました。

雰囲気からですが、
>loadUrl("javascript:クラス.メソッド");
じゃなくて、
>loadUrl("javascript:testFunction");
です。で、JavaScriptのtestFunctionないぶで、クラス.メソッドを呼び出します。


コードを見せてくれれば何かアドバイスできるかもしれません。
公開可能でしょうか?