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 件のコメント:

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

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

    返信削除
  2. 匿名さんへ

    連絡遅くなりました。

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


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

    返信削除