您的位置:首页 > 移动开发 > Android开发

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

2014-04-21 19:56 351 查看
如何在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
plaincopy

void WebView.loadUrl("javascript:xxxx");

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

[java] view
plaincopy

WebView.addJavascriptInterface(<JavaObject>,"<JavascriptObjectName>");

JS: if(window.<JavascriptObjectName>){

var v = window.<JavascriptObjectName>.method(…);

}

参考/article/4183363.html

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

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

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



[java] view
plaincopy

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()

[java] view
plaincopy

// Class fields

WebView wv;

JavascriptInterfacejs;

// onCreate()init

js = new JavascriptInterface();

wv.addJavascriptInterface(js,"jsinterface");

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

[java] view
plaincopy

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系统有的机器没有这个问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: