【发布时间】:2016-03-30 20:54:59
【问题描述】:
我的应用中有一个 WebView,它显示了一个不属于我的页面。我想要的行为是,如果用户点击了任何链接,则会启动设备的浏览器应用程序,并在那里加载生成的页面。不幸的是,这个页面做了一些奇怪的事情,所以shouldOverrideUrlLoading() 不会触发。
我尝试的解决方案是将一些 javascript 挂接到 pushState 并使用接口运行 Android 代码来启动浏览器应用程序。
这是我的界面:
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);
}
这是我的 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:
mWebView.addJavascriptInterface(new LaunchExternalBrowserHack(getContext()), "Android");
所以这似乎有效。浏览器应用程序正在启动,下一页正在打开。
不过,WebView 也在向前发展。我想阻止这种情况,但我找不到阻止 WebView 向前移动的方法,同时仍然允许我捕获转发 url 并启动浏览器应用程序。正如我之前提到的,在这个网页上,shouldOverrideUrlLoading不会触发。
想法?
【问题讨论】:
-
您提到在
onReceiveValue(...)中没有得到结果。您能看到将 javascript 更改为函数调用是否可行吗?就像this answer 建议的那样。具体来说,采用这种风格:(function() { return { var1: \"variable1\", var2: \"variable2\" }; })();
标签: javascript android android-webview