そこで、間接的に受け取る方法が考えられる。対象の javascript の後で、もう一度結果を受け取るための、javascript Interface を実行させるのである。
以下、単純な<input> の値をセットしてそれを別途取り出すもの。
<input type="text" name="user" id="user"/>
このように、HTML が記述されていたとして、、、
static String JSRELAY = "android";
:
:
final WebView webview = (WebView)findViewById(R.id.webView);
final JsRelay jsrelay = new JsRelay();
webview.addJavascriptInterface(jsrelay,JSRELAY);
webview.getSettings().setJavaScriptEnabled(true);
webview.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view,String url){
String user = "uranus";
StringBuilder sb = new StringBuilder();
sb.append("javascript:document.getElementById('user').value = ");
sb.append("\""+user+"\"");
sb.append(";");
sb.append("javascript:"+JSRELAY+".calc(document.getElementById('user').value);");
webview.loadUrl(sb.toString());
}
});
webview.setWebChromeClient(new WebChromeClient());
:
:
*1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Log.d("sample","reslut = "+jsrelay.getUser());
}
});
javacript 連携クラスは、以下のとおり
public class JsRelay{
private String user;
public void calc(String value){
this.user = value;
}
public String getUser(){
return this.user;
}
}
ボタンを押してログに、
reslut = uranus
が出力される。
表示するHTML側に javascript が記述されていなくても、HTMLソースの内容さえ把握していれば、
いろんな事ができそうだ。
気をつけなければならないのは、Android 2.3.3 のエミュレータは、
addJavascriptInterface で動かす連携に問題があるらしく
失敗をする。 Android 4.0 エミュレータは、きちんと動く。
http://code.google.com/p/android/issues/detail?id=12987
*1:Button)findViewById(R.id.button1