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

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

 

结束

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值