在Android的WebView中通过javascript捕获页面重定向

时间:2016-03-30 20:55:00

标签: javascript android android-webview

我的应用中有一个WebView,显示的页面不属于我。我希望的行为是,如果用户点击任何链接,则启动设备的浏览器应用程序,并在那里加载生成的页面。不幸的是,这个页面做了一些奇怪的事情,所以return this->getUser($uname, false, true, true, false); 不会触发。

我尝试的解决方案是将一些javascript挂钩到pushState并使用界面运行Android代码来启动浏览器应用。

这是我的界面:

shouldOverrideUrlLoading()

我在public class LaunchExternalBrowserHack { Context mContext; LaunchExternalBrowserHack(Context c) { mContext = c; } @JavascriptInterface public void launchExternalBrowser(String url) { openUrl(url); } }

页面中注入了一些javascript
onPageFinished()

这是我的javascript:

public void onPageFinished(WebView view, String url) {
     mWebView.loadUrl(javascript);
}

当然,我正在将界面添加到private final String javascript = "javascript:history.pushState = function (state, title, url) { console.log(url); console.log(location.href); Uphoria.launchExternalBrowser(location.origin, url); };";

WebView

所以这似乎有效。浏览器应用程序正在启动,下一页正在打开。

然而,WebView也在向前发展。我想阻止这一点,但我找不到阻止WebView向前移动的方法,同时仍然允许我捕获转发URL并启动浏览器应用程序。正如我之前提到的,使用此网页时,mWebView.addJavascriptInterface(new LaunchExternalBrowserHack(getContext()), "Android"); 正在触发。

想法?

1 个答案:

答案 0 :(得分:1)

这个答案是对的。保留在这里,因为它有重要的相关评论。

您没有从Javascript获得结果的原因是您没有直接调用函数。您正在Javascript中指定一个返回值的函数,但它不会将该函数返回给您的代码,它会将其返回给任何调用history.pushState()

private final String javascript = "javascript:" + "var pushState = history.pushState; history.pushState = function () " +
        "{ pushState.apply(history, arguments); console.log(arguments); return location.href; " +
        "};";

相反,你可以测试这样的东西是否会返回一个值:

private final String javascript = "(function() { return location.href; })();";