【问题标题】:Android WebView err_unknown_url_schemeAndroid WebView err_unknown_url_scheme
【发布时间】:2017-06-01 06:54:09
【问题描述】:

使用下面的简单代码,我可以正确加载我的 url,但是,当我尝试点击以 mailto: whatsapp:开头的 html 链接时,我得到“ERR_UNKNOWN_URL_SCHEME” > 和 tg:(电报)。

谁能帮我解决这个问题?不幸的是,我根本不懂 Java :(

谢谢。

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends Activity {

    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWebView = (WebView) findViewById(R.id.activity_main_webview);

        // Force links and redirects to open in the WebView instead of in a browser
        mWebView.setWebViewClient(new WebViewClient());

        // Enable Javascript
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        // Use remote resource
        mWebView.loadUrl("http://myexample.com");
    }
}

【问题讨论】:

    标签: android html webview


    【解决方案1】:

    你必须在 webview 中设置一个客户端并将它们传递给一个意图

    webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if( URLUtil.isNetworkUrl(url) ) {
                    return false;
                }
                if (appInstalledOrNot(url)) {
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    startActivity( intent );
                } else {
                    // do something if app is not installed
                }
                return true;
            }
    
        });
    }
    

    你可以有一个方法来检查是否安装了应用程序

    private boolean appInstalledOrNot(String uri) {
            PackageManager pm = getPackageManager();
            try {
                pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
                return true;
            } catch (PackageManager.NameNotFoundException e) {
            }
    
            return false;
        }
    

    【讨论】:

    • 非常感谢!这行得通!我能再问你一件事吗?如果设备上没有安装 WhatsApp 或 Telegram,则应用程序崩溃:android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=tg://msg?text=My text通过 Telegram 发送 } 是否可以添加一个检查,如果未安装软件包,则显示带有警告消息的弹出窗口?
    • 完美!非常感谢@cgomezmendez!
    • 似乎 shouldOverrideUrlLoading 这种形式已被弃用。是否值得在可能的情况下使用另一个?另外,我认为您忘记转换为 Uri...
    • 知道如何在 Flutter 中实现同样的效果吗?
    【解决方案2】:

    您需要重写WebViewClient的shouldOverrideUrlLoading方法,您可以在该方法中自行控制链接传输。

    因为html links that starts with mailto: whatsapp: and tg: (Telegram).不是常见的url以“http://”或“https://”开头,所以WebView无法解析到正确的位置,我们应该使用intent来重定向url。

    例如:

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url == null || url.startsWith("http://") || url.startsWith("https://")) return false;
    
                try {
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    view.getContext().startActivity(intent);
                    return true;
                } catch (Exception e) {
                    Log.i(TAG, "shouldOverrideUrlLoading Exception:" + e);
                    return true;
                }
            }
    

    然后将WebViewClient 设置为您的WebView,如下所示:

    public class MainActivity extends Activity {
    
    private WebView mWebView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mWebView = (WebView) findViewById(R.id.activity_main_webview);
    
        // Force links and redirects to open in the WebView instead of in a browser
        mWebView.setWebViewClient(new WebViewClient() {
    
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url == null || url.startsWith("http://") || url.startsWith("https://")) return false;
    
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                view.getContext().startActivity(intent);
                return true;
            } catch (Exception e) {
                Log.i(TAG, "shouldOverrideUrlLoading Exception:" + e);
                return true;
            }
        }
        });
    
        // Enable Javascript
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
    
        // Use remote resource
        mWebView.loadUrl("http://myexample.com");
    }}
    

    【讨论】:

      【解决方案3】:
      @Override
              public boolean shouldOverrideUrlLoading(WebView wv, String url) {
                  if(url.startsWith("tel:") || url.startsWith("whatsapp:")) {
                      Intent intent = new Intent(Intent.ACTION_VIEW);
                      intent.setData(Uri.parse(url));
                      startActivity(intent);
                      return true;
                  }
                  return false;
              }
      

      将此代码放入您的 mWebView.setWebViewClient(new WebViewClient()。它将完美地适用于所有链接,例如 tel:whatsapp:ma​​ilto: 等。

      【讨论】:

        【解决方案4】:

        这项工作适合我

        "webview.setWebViewClient(新的 WebViewClient() { 字符串 currentUrl;

               @Override
               public boolean shouldOverrideUrlLoading(WebView view, String url) {
                   currentUrl = url;
        
                   if (url.startsWith("http") || url.startsWith("https")) {
                       return false;
                   }
                   if (url.startsWith("intent")) {
        
        
        
        
                     try {
                         Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
        
                         String fallbackUrl = intent.getStringExtra("browser_fallback_url");
                       if (fallbackUrl != null) {
                           webview.loadUrl(fallbackUrl);
                           return true;
                       }}
        
                   catch (URISyntaxException e) {
                       //not an intent uri
                   }
           return true;//do nothing in other cases
        

        【讨论】:

          【解决方案5】:

          mailto 链接不会加载到您的 webview 中。您已在 shouldOverrideUrlLoading 中像这样检查它并使用 intent 处理它。

              public boolean shouldOverrideUrlLoading(WebView view, String url) {
              if (url.startsWith("mailto:")) {
          
                  Intent share = new Intent(Intent.ACTION_SEND);
                  share.setType("text/plain");
                  share.putExtra(Intent.EXTRA_TEXT, message);
                  startActivity(Intent.createChooser(share, "Title of the dialog the system will open"));
                  view.reload();
                  return true;
              }
            }
          

          类似问题Android Webview ERR_UNKNOWN_URL_SCHEME Error

          【讨论】:

          • 这仅适用于邮件而不适用于“whatsapp: and tg: (Telegram)”。
          • @cgomezmendez 这是一个例子.. 我不知道他在 if 循环中想要什么.. 看看逻辑..
          猜你喜欢
          • 1970-01-01
          • 2016-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-10
          • 1970-01-01
          • 2015-12-22
          相关资源
          最近更新 更多