如何在Android WebView调用 Javascript 并返回值
@author Anderson Mao, 2012-03-13
如何在Android WebView 调用 Javascript 并返回值
How Android WebView Call JavascriptFunction and Return Value to Java
Android WebView 可以方便的通过Java 调用 Javascript:
void WebView.loadUrl("javascript:xxxx");
也可以方便的在Javascript里面调用Java:
WebView.addJavascriptInterface(<JavaObject>,"<JavascriptObjectName>");
JS: if(window.<JavascriptObjectName>){
var v = window.<JavascriptObjectName>.method(…);
}
参考:http://crazier9527.iteye.com/blog/716028
问题:Javascript调用Java可以返回值,但是Java调用Javascript时loadUrl返回是void。如果有需求需要返回一个值,应该如何处理呢?
好,开始,AndroidWebView 调用 Javascript 并返回值,方法如下:
1. 先建立一个Java Class 作为Interface
private static class JavascriptInterface{
privateMap<String,String> valueMap = newHashMap<String, String>();
public String set(String key, Stringvalue) {
valueMap.put(key, value);
return "";
}
public String get(String key){
return valueMap.get(key);
}
}
2. 设置WebView的addJavascriptInterface()
// Class fields
WebView wv;
JavascriptInterfacejs;
// onCreate()init
js = new JavascriptInterface();
wv.addJavascriptInterface(js,"jsinterface");
3. 调用Javascript,并返回值(注意: Thread.sleep是必须的)
private booleanisMapPage(){
js.set(JS_KEY, "-1");
wv.loadUrl("javascript:"
+"if(window.jsinterface){"
+" if(window.gnav){" // Your conditions
+" window.jsinterface.set('"+JS_KEY+"','1');"
+" }else{"
+" window.jsinterface.set('"+JS_KEY+"','0');"
+" }"
+"}"
);
// Sleep moment to let JS finish. Otherwise js.get() run first
try{
Thread.sleep(200);
}catch(InterruptedExceptionex){
// Ignore
}
Stringv = js.get(JS_KEY);
System.out.println("isMapPage: getValue: value="+v);
if("1".equals(v)){
return true;
}
return false;
}
注意:如果用的是Android 2.3的模拟器,在模拟器里面Javascript调用Java会出现异常如下:
JNIWARNING: jarray 0x4074f6e0 points to non-array object (Ljava/lang/String;)
然后Android 程序崩溃退出。
这是Android2.3模拟器的一个Issue,参考:
http://code.google.com/p/android/issues/detail?id=12987
临时解决方法是使用Android2.2模拟器,真机Android2.3系统有的机器没有这个问题。
结束。