在我的 Android 应用程序中,我有一个 WebView。我想every在我的 WebView 中单击链接以启动我的设备上已注册的应用程序(如果有),否则在外部浏览器中打开。例如,如果用户从 WebView 中单击 Facebook 页面链接,则应启动 Facebook 应用程序(如果 facebook 已在设备上注册以处理 facebook 链接)。如果没有注册应用程序,它应该启动外部浏览器(即,它不应该在同一 WebView 中加载页面)。
目前(默认情况下),WebView 仅加载在 WebView 自身内单击的任何链接。
我意识到我需要重写 shouldOverrideUrlLoading 来拦截这些链接点击:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// what should go here to trigger the registered app or fall back to external browser for all link clicks in the WebView?
}
});
我还查看了意图过滤器,但这似乎与此要求相反(意图过滤器似乎是我注册的一种方式myandroid 应用程序来处理其他地方的网络点击)。
Update 1:
I am not想要拦截任何特定的主机名或方案 - 我想要every在我的网络视图中单击的链接将“委托”给Android,其中Android决定是否启动已注册的应用程序,弹出一个选项供用户选择要在哪个应用程序中打开,或者在网络浏览器中打开,具体取决于用户设置。
具体来说,如果我点击链接https://www.facebook.com/blah https://www.facebook.com/blah它应该在 Facebook 应用程序中启动并带我到那里的 blah 页面。
该修复仅涉及将 shouldOverrideUrlLoading 处理为 true,如果该 url 不在我自己的应用程序内,则返回 true。返回 true 时,它将启动注册的应用程序或应用程序选择器对话框或浏览器,具体取决于配置的上下文。
mWebview.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
boolean isLocalUrl = false;
try {
URL givenUrl = new URL(url);
String host = givenUrl.getHost();
if(host.contains("myapp.com"))
isLocalUrl = true;
} catch (MalformedURLException e) {
}
if (isLocalUrl)
return super.shouldOverrideUrlLoading(view, url);
else
{
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
}
});
我还意识到 Android 上的当前状态(我在小米 Mi 4 上的 MIUI 7 上进行了测试,基于 Android Kitkat,但论坛表明至少对于大多数棉花糖之前的 Android 来说这基本上是正确的),其中指向 facebook 页面的链接WebView 未在 Facebook 应用程序中打开。它也不为用户提供在 Facebook 应用程序中打开的选项。这以前可以用,但现在不行了。如果我们使用上面的代码,它总是在浏览器中启动。很多误会都是因为这个发生的。它与其他网站(twitter、quora 等)按预期工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)