【问题标题】:Google Forum short URL not working in Android app WebviewGoogle 论坛短 URL 在 Android 应用程序 Webview 中不起作用
【发布时间】:2019-08-28 04:47:39
【问题描述】:

我在网站中使用谷歌论坛来填写详细信息,在 Android 应用程序的 Webview 中使用该网站。当我尝试在 Webview 中打开 Google 论坛短链接时显示错误:net::ERR_UNKNOWN_URL_SCHEME,错误代码:-10.

在 webview 屏幕中显示这一行: intent://<a href="https://docs.google.com/forms/d/e/##########/viewform%3Fusp%3Dsend_form;end">forms.gle/************#Intent;package=com.google.android.gms;action=com.google.firebase.dynamiclinks.VIEW_DYNAMIC_LINK;scheme=https;S.browser_fallback_url=https://docs.google.com/forms/d/e/########/viewform%3Fusp%3Dsend_form;end</a>; could not be loaded because:<br><br>net::ERR_UNKNOWN_URL_SCHEME

完整的 URL 工作正常,浏览器中的 Url 工作正常。

使用的语言:Kotlin, 安卓设备:三星A 10, 安卓版本:9(饼图)

使用的代码: webview.loadUrl("https://forms.gle/#########")

并使用了这些设置:

webview?.getSettings()?.javaScriptCanOpenWindowsAutomatically = true
webview?.getSettings()?.setAppCacheEnabled(true)
webview?.getSettings()?.setAppCachePath(this.cacheDir.path)
webview?.getSettings()?.cacheMode = WebSettings.LOAD_DEFAULT```

【问题讨论】:

    标签: android kotlin webview google-forms


    【解决方案1】:

    要修复这些类型的问题,我们必须重写我们设置为 Webview 的 WebView 客户端的 shouldOverrideUrlLoading 方法。有时覆盖的 url 可以以 intent 开头,因此必须以其他方式处理它们。附上下面的示例代码。

    webView.setWebViewClient(new WebViewClient() {
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url) {
                if (url.startsWith("http:") || url.startsWith("https:")) {
                    return false;
                } else {
                    if (url.startsWith("intent://")) {
                        try {
                            Context context = webView.getContext();
                            Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
                            if (intent != null) {
                                PackageManager packageManager = context.getPackageManager();
                                ResolveInfo info = packageManager.resolveActivity(intent,
                                        PackageManager.MATCH_DEFAULT_ONLY);
                                // This IF statement can be omitted if you are not strict about 
                                // opening the Google form url in WebView & can be opened in an 
                                // External Browser 
                                if ((intent != null) && ((intent.getScheme().equals("https"))
                                        || (intent.getScheme().equals("http")))) {
                                    String fallbackUrl = intent.getStringExtra(
                                            "browser_fallback_url");
                                    webView.loadUrl(fallbackUrl);
                                    return true;
                                }
                                if (info != null) {
                                    context.startActivity(intent);
                                } else {
                                    // Call external broswer
                                    String fallbackUrl = intent.getStringExtra(
                                            "browser_fallback_url");
                                    Intent browserIntent = new Intent(Intent.ACTION_VIEW,
                                            Uri.parse(fallbackUrl));
                                    context.startActivity(browserIntent);
                                }
                                return true;
                            } else {
                                return false;
                            }
                        } catch (Exception e) {
                            return false;
                        }
                    } else {
                        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                        webView.getContext().startActivity(intent);
                        return true;
                    }
                }
            }
        });
    

    【讨论】:

    • 谢谢,请解释您的解决方案,因为它看起来很复杂。我只采用了一些我认为相关的方法。
    【解决方案2】:

    谷歌支持https://support.google.com/docs/thread/12941044?hl=enkotlin 中的解决方案

    override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
    
                    if (url.startsWith("intent://")){
                        val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
                        if(intent != null){
                            val fallbackUrl = intent.getStringExtra("browser_fallback_url")
                            return if (fallbackUrl != null){
                                mDiscourse?.loadUrl(fallbackUrl)
                                true
                            } else {
                                false
                            }
                        }
                    }
    
                    return super.shouldOverrideUrlLoading(view, url)
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多