WebView で JavaScript から Java のコードを呼び出すのは、簡単に実現できる。WebView を継承したクラスで、addJavaScriptInterface() メソッドを呼び出すだけだ。
addJavascriptInterface(new HogeJSObj(context, this), "hogeJSObj");
上記の例では、HogeJSObj クラスの public メソッドを JavaScript から呼び出せるようになる。HogeJSObj クラスに show() メソッドが用意されているのであれば、WebView で読み込んだ HTML/JavaScript から以下のように Java のメソッドを呼び出せる。
<a href="javascript:void(0);" onclick="javascript:hogeJSObj.show();">Click!</a>
ところが Nexus 7で、このコードが動かない。調べてみると、Android 4.2で仕様変更があったようだ。セキュリティを考慮して、@JavascriptInterface アノテーションを付加した public メソッドのみ呼び出せるようになっているという(WebView クラスの説明参照)。
For applications targeted to API level JELLY_BEAN_MR1 and above, only public methods that are annotated with JavascriptInterface can be accessed from JavaScript. For applications targeted to API level JELLY_BEAN or below, all public methods (including the inherited ones) can be accessed, …
JavaScript から呼び出したいのであれば、HogeJSObj クラスの show() メソッドは、以下のようにアノテーションをつける必要がある。
@JavascriptInterface public void show() { .... }