问题:应用需要统计网页打开情况,部分三方网页在网页跳转时无法在onPageFinished中监测到。使用代码注入在网页url发生变化时调用原生代码,传入新的url。
一,其他设置
WebView 设置支持 JavaScript 脚本
webSettings.setJavaScriptEnabled(true);
使用 addJavascriptInterface 方法将 Java 对象映射到 JavaScript 中
mX5Webview.addJavascriptInterface(new Object(){
//***************************************************************************
// 1.tdxFuncName 功能名称
// 2.tdxFuncParam 参数
// 3.tdxCallBack 回调Web函数
// 4.tdxPageID 网页唯一ID
//***************************************************************************
@SuppressWarnings("unused")
@JavascriptInterface
public void TdxWebCall(final String tdxFuncName,final String tdxFuncParam,final String tdxCallBack,final String tdxPageID)
{
//todo
}
},"tdx_java");
二,待注入的JS代码
private void processInject(){
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
if(mX5Webview == null)
return;
String javascript = "javascript:" +
"var lastUrl = window.location.href;" +
"setInterval(function() {" +
"const currentUrl = window.location.href;" +
"if (currentUrl !== lastUrl) {" +
"console.log(window.location.href);" +
"lastUrl = currentUrl;" +
"window.tdx_java.TdxWebCall(\"onUrlChanged\", JSON.stringify({\"currentUrl\":currentUrl}),\"callback\", \"id\" );" +
"}" +
"}, 500);";
mX5Webview.loadUrl(javascript);
}
},2000);
}
正常在onPageFinished方法中调用此方法,实现向WebView中注入JS代码,如不在这里调用需确保页面已完成加载,可设置一个延时防止页面未加载完成。
三,调试方法
可通过打印声明的变量lastUrl验证代码是否注入成功
edge调试链接:
edge://inspect/#devices