如何在Android上注册的应用程序中从我的WebView中启动Web链接?

时间:2016-05-25 03:32:14

标签: android android-webview

在我的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页面。

2 个答案:

答案 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应用中注册UriWebBrowserActivity方案,当用户点击外部应用中的任何链接时,如果主机名和Uri方案与之匹配,则会打开您的应用你已经注册了。正如开发人员文档所说,您应该知道超链接的主机和方案,任何随机链接都不会打开您的应用程序。

礼貌:https://developer.android.com/training/app-links/index.html

我相信,从应用程序的WebView打开特定活动应该只使用IntentFilters来完成。