在我的Android应用程序中,我有一个WebView。我希望在我的WebView中单击每个链接以在我的设备上启动已注册的应用程序(如果有),否则在外部浏览器中打开。例如,如果用户点击WebView内的Facebook页面链接,它应该启动Facebook应用程序(如果Facebook在设备上注册以处理Facebook链接)。如果没有注册app,它应该启动外部浏览器(即,它不应该在同一个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?
}
});
我也看了一下intent过滤器,但这似乎是这个要求的反面(意图过滤器似乎是我注册我的 android应用程序来处理其他地方的网页点击的方式)。
更新1 :
我不希望拦截任何特定的主机名或方案 - 我希望在我的网页视图中点击的每个链接被“委托”给android,其中android决定是否启动已注册的应用程序,为用户选择要打开的应用程序,或者在Web浏览器中打开,具体取决于用户设置。
具体来说,如果我点击https://www.facebook.com/blah的链接,它应该在facebook应用程序中启动并带我到那里的blah页面。
答案 0 :(得分:4)
修复只涉及处理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上的当前状态(我在MIUI 7上测试了基于Android Kitkat的小米Mi 4,但论坛表明这对于大多数前Marshmallow机器人来说至少是这样),其中链接到WebView中的Facebook页面无法在Facebook应用程序中打开。它也不会给用户提供在Facebook应用程序中打开的选项。这曾经比较早,但现在不起作用。如果我们使用上面的代码,它总是在浏览器中启动。由于这个原因,发生了很多误解。它与其他网站(推特,quora等)一样有效。
答案 1 :(得分:0)
在Android中可以点击网络链接打开应用,我们已经看到很多应用已经这样做了。您可以在host
应用中注册Uri
和WebBrowserActivity
方案,当用户点击外部应用中的任何链接时,如果主机名和Uri方案与之匹配,则会打开您的应用你已经注册了。正如开发人员文档所说,您应该知道超链接的主机和方案,任何随机链接都不会打开您的应用程序。
礼貌:https://developer.android.com/training/app-links/index.html
我相信,从应用程序的WebView打开特定活动应该只使用IntentFilters来完成。