Android javascript: で値を受け取るには、

Android WebView # loadUrl("javascript: で実行した結果を直接受け取ることができない。

そこで、間接的に受け取る方法が考えられる。対象の 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