整理自:http://blog.sina.com.cn/s/blog_67ac56e70101ajlp.html
本文实现的是使用WebView调用js代码,并获得function的return值
1. 创建自定义的 MyWebView 并继承 WebView
public class MyWebView extends WebView {
public MyWebView(Context context) {
super(context);
}
public MyWebView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public MyWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public String stringByEvaluatingJavaScriptFromString(String script) {
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.JELLY_BEAN) {
try{
Field mp = WebView.class.getDeclaredField("mProvider");
mp.setAccessible(true);
Object webViewObject = mp.get(this);
Field wc = webViewObject.getClass().getDeclaredField("mWebViewCore");
wc.setAccessible(true);
Object webViewCore = wc.get(webViewObject);
Field bf = webViewCore.getClass().getDeclaredField("mBrowserFrame");
bf.setAccessible(true);
Object browserFrame = bf.get(webViewCore);
Method stringByEvaluatingJavaScriptFromString = browserFrame.getClass()
.getDeclaredMethod("stringByEvaluatingJavaScriptFromString",
String.class);
stringByEvaluatingJavaScriptFromString.setAccessible(true);
Object obj_value = stringByEvaluatingJavaScriptFromString.invoke(
browserFrame, script);
return String.valueOf(obj_value);
}catch(Exception e) {
e.printStackTrace();
Log.e("!!!","stringByEvaluatingJavaScriptFromString", e);
}
return null;
}else{
try{
Field[]fields= WebView.class.getDeclaredFields();
//由webview取到webviewcore
Field field_webviewcore = WebView.class.getDeclaredField("mWebViewCore");
field_webviewcore.setAccessible(true);
Object obj_webviewcore = field_webviewcore.get(this);
//由webviewcore取到BrowserFrame
Field field_BrowserFrame = obj_webviewcore.getClass().getDeclaredField(
"mBrowserFrame");
field_BrowserFrame.setAccessible(true);
Object obj_frame = field_BrowserFrame.get(obj_webviewcore);
//获取BrowserFrame对象的stringByEvaluatingJavaScriptFromString方法
Method method_stringByEvaluatingJavaScriptFromString = obj_frame.getClass()
.getMethod("stringByEvaluatingJavaScriptFromString", String.class);
//执行stringByEvaluatingJavaScriptFromString方法
Object obj_value = method_stringByEvaluatingJavaScriptFromString.invoke(
obj_frame,
script);
//返回执行结果
return String.valueOf(obj_value);
}catch(Exception e) {
e.printStackTrace();
Log.e("!!!","stringByEvaluatingJavaScriptFromString", e);
}
return null;
}
}
}
2. 使用
(a)加载页面 :webView.loadUrl("file:///android_asset/www/test.html");
(b)运行js:
(1)旧的方法,不能获得return值:webView.loadUrl("javascript:fun()");
(2)新的方法,不能获得return值:
Toast.makeText(TestActivity.this,webView.stringByEvaluatingJavaScriptFromString("javascript:fun()"),Toast.LENGTH_LONG).show();
(c)获得var值
Toast.makeText(TestActivity.this,webView.stringByEvaluatingJavaScriptFromString("varName"),Toast.LENGTH_LONG).show();
例子代码:http://download.youkuaiyun.com/detail/qqgrid/8210305