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

And*_*rew 11 javascript android android-webview

我的应用程序中有一个WebView,显示不属于我的页面.我希望的行为是,如果用户点击任何链接,则启动设备的浏览器应用程序,并在那里加载生成的页面.不幸的是,这个页面正在做一些奇怪的事情,所以shouldOverrideUrlLoading()不要开火.

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

这是我的界面:

public class LaunchExternalBrowserHack {
    Context mContext;

    LaunchExternalBrowserHack(Context c) {
        mContext = c;
    }

    @JavascriptInterface
    public void launchExternalBrowser(String url) {
        openUrl(url);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public void onPageFinished(WebView view, String url) {
     mWebView.loadUrl(javascript);
}
Run Code Online (Sandbox Code Playgroud)

这是我的javascript:

private final String javascript = "javascript:history.pushState = function (state, title, url) { console.log(url); console.log(location.href); Uphoria.launchExternalBrowser(location.origin, url); };";
Run Code Online (Sandbox Code Playgroud)

当然,我正在添加界面WebView:

mWebView.addJavascriptInterface(new LaunchExternalBrowserHack(getContext()), "Android");
Run Code Online (Sandbox Code Playgroud)

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

但是,WebView也在向前发展.我想阻止这一点,但我找不到阻止WebView向前移动的方法,同时仍然允许我捕获转发URL并启动浏览器应用程序.正如我之前提到的,使用这个网页,shouldOverrideUrlLoading没有解雇.

想法?

Roh*_*gre 5

用户正试图离开页面.阻止他搬出去,返回假.让他离开,不要返回任何东西,但你可以执行任何你可能想要的代码.发生导航事件(包括页面刷新)时会立即触发此事件.

private final String javascript = "window.onbeforeunload = function(){ dosomething(); }; window.unload = function(){ dosomething(); }; function dosomething() { /* Write code here */  };"
Run Code Online (Sandbox Code Playgroud)

您需要包含上面的整个javascript代码,因为某些浏览器使用onbeforeunload并且有些使用unload

编辑

在仔细阅读了您的问题之后,我发现我的解决方案没什么用处.

这是另一种使用方法history.如果您的历史记录为空白,则表示其为第一页.但如果您在历史记录中有一些项目,则表示已进行导航.

你可以检查如下

private final String javascript = "javascript:"+"if(window.history.length>=1 && document.referrer=='') Android.launchExternalBrowser(location.href);";
Run Code Online (Sandbox Code Playgroud)


Kno*_*sos 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; " +
        "};";
Run Code Online (Sandbox Code Playgroud)

相反,您可以测试类似的内容是否返回一个值:

private final String javascript = "(function() { return location.href; })();";
Run Code Online (Sandbox Code Playgroud)