如何在Android WebView 调用 Javascript 并返回值

如何在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:

[java]  view plain copy
  1. void WebView.loadUrl("javascript:xxxx");  

也可以方便的在Javascript里面调用Java:

[java]  view plain copy
  1. WebView.addJavascriptInterface(<JavaObject>,"<JavascriptObjectName>");  
  2.   
  3. JS: if(window.<JavascriptObjectName>){  
  4.     var v = window.<JavascriptObjectName>.method(…);  
  5. }  

参考http://crazier9527.iteye.com/blog/716028


问题:Javascript调用Java可以返回值,但是Java调用Javascript时loadUrl返回是void。如果有需求需要返回一个值,应该如何处理呢?

 

好,开始,AndroidWebView 调用 Javascript 并返回值,方法如下:

1. 先建立一个Java Class 作为Interface

[java]  view plain copy
  1. private static class JavascriptInterface{  
  2. privateMap<String,String> valueMap = newHashMap<String, String>();  
  3.     public String set(String key, Stringvalue) {  
  4.         valueMap.put(key, value);  
  5.         return "";  
  6.   
  7.     }  
  8.   
  9.     public String get(String key){  
  10.         return valueMap.get(key);  
  11.     }  
  12. }  
 

2. 设置WebView的addJavascriptInterface()

[java]  view plain copy
  1. // Class fields  
  2. WebView wv;  
  3. JavascriptInterfacejs;  
  4.   
  5. // onCreate()init  
  6. js = new JavascriptInterface();  
  7. wv.addJavascriptInterface(js,"jsinterface");  

 

3. 调用Javascript,并返回值(注意: Thread.sleep是必须的)

[java]  view plain copy
  1. private booleanisMapPage(){  
  2.     js.set(JS_KEY, "-1");  
  3.   
  4.     wv.loadUrl("javascript:"  
  5.          +"if(window.jsinterface){"  
  6.          +"    if(window.gnav){" // Your conditions  
  7.          +"        window.jsinterface.set('"+JS_KEY+"','1');"  
  8.          +"    }else{"  
  9.          +"        window.jsinterface.set('"+JS_KEY+"','0');"  
  10.          +"    }"  
  11.          +"}"  
  12.          );  
  13.   
  14. // Sleep moment to let JS finish. Otherwise js.get() run first  
  15. try{  
  16.     Thread.sleep(200);  
  17. }catch(InterruptedExceptionex){  
  18.      // Ignore  
  19. }  
  20.   
  21. Stringv = js.get(JS_KEY);  
  22. System.out.println("isMapPage: getValue: value="+v);  
  23. if("1".equals(v)){  
  24.     return true;  
  25. }  
  26. return false;  
  27. }  
 

注意:如果用的是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系统有的机器没有这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值