我的应用中有一个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);
}
}
:
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");
不正在触发。
想法?
答案 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; })();";