如何在网络视图 Android 应用程序上使用外部浏览器

How to use external browser on web view Android app

我将 WordPress 网站转换为 android 应用程序,在我的网站上有很多外部链接,我需要打开外部链接浏览器,如电报,在电报中,所有外部链接都在应用程序的外部浏览器中打开

您可以添加一个WebViewClient to your webview and override the shouldOverrideUrlLoading方法。这将在单击 link 时为您提供回调,您可以检查 url 并决定是要在 webview 中打开还是在外部浏览器中打开它。

例如:

private class MyCustomWebClient : WebViewClient() {

        @TargetApi(Build.VERSION_CODES.N)
        override fun shouldOverrideUrlLoading(
            view: WebView?,
            request: WebResourceRequest?
        ) = if (interceptUrlLoading(request?.url?.toString())) {
            true
        } else {
            super.shouldOverrideUrlLoading(view, request)
        }

        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean =
            if (interceptUrlLoading(url)) {
                true
            } else {
                super.shouldOverrideUrlLoading(view, url)
            }

        private fun interceptUrlLoading(url: String?): Boolean {
            return if (url.equals("telegram url ...")) {
                startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) 
                true
            } else {
               false
            }
        }
}

因为@peshkira 给出了一个很好的解决方案,但我建议使用 CustomTab.

使用自定义选项卡,您无需创建网络视图即可获取浏览器实例。由于它提供导航感知,因此浏览器会在外部导航时向应用程序传递回调。您可以修改和更新以下 -

Custom menu

Color of the address bar

Custom action button

Custom enter and exit animations

CustomTab 设置 -

dependencies {
    ...
    implementation "androidx.browser:browser:1.2.0"
}

在您的代码中,打开一个 CustomTab -

String url = ¨https://paul.kinlan.me/¨;
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));

通过连接到服务和 pre-loading 浏览器,使用自定义选项卡打开 link 最多可以节省 700 毫秒。

大多数浏览器都支持 CustomTab,例如 Chrome、Samsung Mobile Broswer、Microsoft Edge 等。 请关注Custom Tabs Best Practices. Here is a gitHub example.


编辑

正如您在评论中提到的 “每个 post 都有 1 个外部 link”,然后您遵循选项 -

  1. 创建WebView打开link
  2. 使用 intent 打开设备外部浏览器
  3. 使用CustomTab打开浏览器实例

我认为这三个行为都可以通过 this gif 得到很好的解释。

现在,要在您的应用中显示所有 post,我相信您使用的是 RecycleView,因此您可以从三个选项中做出决定,您可以收听点击其中一个post 通过在 post 上使用点击侦听器,如下所示 -

postItem.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        handleClickOnLink(postUrl);
    }
});

现在在你的方法体中 handleClickOnLink(String postUrl) 你可以使用你的代码来决定你想如何打开 link。

正如我上面提到的,使用 CustomTab 将是选择之一,我认为在这种情况下这将是一个不错的选择,因此您可以实现如下方法 -

public void handleClickOnLink(String postUrl){
    CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();

    //setting toolbar color 
    builder.setToolbarColor(getContext().getColor(R.color.colorPrimaryDark));
    //can be more modification as builer.setTitle() and more

    CustomTabsIntent customTabsIntent = builder.build();
    customTabsIntent.launchUrl(getContext(), Uri.parse(postUrl));
}

如果设备的浏览器不支持 CustomTab,则设备默认浏览器将打开。

结果如下 -

快乐编码!

问题已解决,感谢您的回放

Source (from sven)

webView.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url != null && (url.startsWith("http://") || url.startsWith("https://"))) {
        view.getContext().startActivity(
            new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
        return true;
    } else {
        return false;
    }
}

});