Android获取网页中js变量

来源:互联网 发布:淘宝商家放单微信群 编辑:程序博客网 时间:2024/05/29 14:39

安卓4.4之前获取js变量
1). 获取网页标题

js写法: document.title就可以了. 但是webview中拿不到document对象吧? 为难吧. 我教你.

实现技巧: 自己注入js函数并传参

示例代码:

webView.addJavascriptInterface(new Object(){
@JavascriptInterface
public void getDocumentTitle(String title) {
onGetDocumentTitle(title);
}
}, “native”); // 常规写法, 定义js 的native接口

@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);

// 直接执行自己定义的native接口, 参数是document.title   webView.loadUrl("javascript:native.getDocumentTitle(document.title);");

}

看到了吧. 我在webview中拿不到document对象, 但是js中可以吧. 那我直接在js参数中处理就好了. 曲线救国啊…

安卓4.4之后获得变量更简单

lineos:false

1
2
3
4
5
6
7
8

2
3

function getGreetings() {
return 1;
}

private void testEvaluateJavascript(WebView webView) {
webView.evaluateJavascript(“getGreetings()”, new ValueCallback() {

@Override
public void onReceiveValue(String value) {
Log.i(LOGTAG, “onReceiveValue value=” + value);
}});
}

网页加载完成调用js代码
myWebView.setWebViewClient(new WebViewClient() {

@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//在这里执行你想调用的js函数
}

});

Uncaught TypeError: Object [object Object] has no method
安全限制问题

如果只在4.2版本以上的机器出问题,那么就是系统处于安全限制的问题了。Android文档这样说的

Caution: If you’ve set your targetSdkVersion to 17 or higher, you must add the @JavascriptInterface annotation to any method that you want available your web page code (the method must also be public). If you do not provide the annotation, then the method will not accessible by your web page when running on Android 4.2 or higher.
中文大意为

警告:如果你的程序目标平台是17或者是更高,你必须要在暴露给网页可调用的方法(这个方法必须是公开的)加上@JavascriptInterface注释。如果你不这样做的话,在4.2以以后的平台上,网页无法访问到你的方法。

All WebView methods must be called on the same thread

过滤日志曾发现过这个问题。
lineos:false

1
2
3
4
5
6
7
8
9

E/StrictMode( 1546): java.lang.Throwable: A WebView method was called on thread ‘JavaBridge’. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {528712d4} called on Looper (JavaBridge, tid 121) {52b6678c}, FYI main Looper is Looper (main, tid 1) {528712d4})
E/StrictMode( 1546): at android.webkit.WebView.checkThread(WebView.java:2063)
E/StrictMode( 1546): at android.webkit.WebView.loadUrl(WebView.java:794)
E/StrictMode( 1546): at com.xxx.xxxx.xxxx.xxxx.xxxxxxx$JavaScriptInterface.onCanGoBackResult(xxxx.java:96)
E/StrictMode( 1546): at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
E/StrictMode( 1546): at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
E/StrictMode( 1546): at android.os.Handler.dispatchMessage(Handler.java:102)
E/StrictMode( 1546): at android.os.Looper.loop(Looper.java:136)
E/StrictMode( 1546): at android.os.HandlerThread.run(HandlerThread.java:61)

在js调用后的Java回调线程并不是主线程。如打印日志可验证
lineos:false

1

ThreadInfo=Thread[WebViewCoreThread,5,main]

解决上述的异常,将webview操作放在主线程中即可。

1
2
3
4
5
6

webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl(YOUR_URL).
}
});

0 0
原创粉丝点击