如何在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系统有的机器没有这个问题。