【问题标题】:Android Webview ERR_UNKNOWN_URL_SCHEME ErrorAndroid Webview ERR_UNKNOWN_URL_SCHEME 错误
【发布时间】:2015-04-24 16:49:30
【问题描述】:

当我点击一个链接到 mailto:admin@ikiyuzoniki.net 时,我收到了这个错误:

网络:ERR_UNKNOWN_URL_SCHEME

我尝试添加 if(url.startsWith("mailto:")) 条件,但它不起作用。

这是我的MyWebViewClient 方法:

public class MyWebViewClient extends WebViewClient {

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {

        }

        @Override
        public void onPageFinished(WebView view, String url) {
            view.setVisibility(View.VISIBLE);
            final Animation fade = new AlphaAnimation(0.0f, 1.0f);
            fade.setDuration(200);
            view.startAnimation(fade);
            view.setVisibility(View.VISIBLE);

        }

    }
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if(url.startsWith("mailto:")){
            Intent intent = null;
            try {
                intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            view.getContext().startActivity(intent);
        }
        else if (url.endsWith(".mp3")) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.parse(url), "audio/*");
            startActivity(intent);

        } else if (url.endsWith(".mp4") || url.endsWith(".3gp")) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.parse(url), "video/*");
            startActivity(intent);
        }
        else {
            return false;
        }
        view.reload();
        return true;
    }

这就是我在loadUrl 之前将函数添加到我的网络视图的方式:

...
mWebview.setWebViewClient(new MyWebViewClient());
...

【问题讨论】:

    标签: android mailto


    【解决方案1】:

    试试这个

    if(url.startsWith("mailto:")){
            MailTo mt = MailTo.parse(url);
            Intent i = new Intent(Intent.ACTION_SEND);
            i.setType("text/plain");
            i.putExtra(Intent.EXTRA_EMAIL, new String[]{mt.getTo()});
            i.putExtra(Intent.EXTRA_SUBJECT, mt.getSubject());
            i.putExtra(Intent.EXTRA_CC, mt.getCc());
            i.putExtra(Intent.EXTRA_TEXT, mt.getBody());
            mContext.startActivity(i);
            view.reload();
            return true;
        } 
    

    【讨论】:

    【解决方案2】:

    出现此错误是因为WebView无法识别URL Scheme,例如WebView通常会识别http和https,而不是这些,例如-intent://,market://,app: //,mail:// 等将不会被 webview 识别,除非我们添加一个处理程序来处理这些 url 方案或禁用这些方案并且只加载 http 和 https 方案。

    这是一个修复通用意图 url 方案的示例。

    mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
    return loadUrl(view, url);
    }
    
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    }
    
    @Override
    public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    }
    
    @Override
    public void onReceivedError(WebView view, int errorCode, String description,String failingUrl) {
    super.onReceivedError(view, errorCode, description, failingUrl);
    //Log.d("Web Request Error", "");
    showError(errorCode);
    }
    
    @TargetApi(Build.VERSION_CODES.M)
    @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
    super.onReceivedError(view, request, error);
    Log.d("WebResource error", "");
    int errorCode = error.getErrorCode();
    showError(errorCode);
    }
    });
    
    private boolean loadUrl(WebView view, String url) {
    if (url.startsWith("http:") || url.startsWith("https:")) {
    view.loadUrl(url);
    return false;
    }
    // Otherwise allow the OS to handle it
    else if (url.startsWith("tel:")) {
    Intent tel = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
    startActivity(tel);
    return true;
    } else if (url.toLowerCase().startsWith("mailto:")) {
    MailTo mt = MailTo.parse(url);
    Intent emailIntent = newEmailIntent(mt.getTo(), mt.getSubject(), mt.getBody(), mt.getCc());
    startActivity(emailIntent);
    return true;
    }
    return true;
    }
    

    【讨论】:

      【解决方案3】:

      这是我的 MyWebViewClient 方法:

      public class MyWebViewClient extends WebViewClient {
      
          @Override
          public void onPageStarted(WebView view, String url, Bitmap favicon) {
      
          }
      
          @Override
          public void onPageFinished(WebView view, String url) {
              view.setVisibility(View.VISIBLE);
              final Animation fade = new AlphaAnimation(0.0f, 1.0f);
              fade.setDuration(200);
              view.startAnimation(fade);
              view.setVisibility(View.VISIBLE);
      
          }
      
      }
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
          if(url.startsWith("mailto:")){
              Intent intent = null;
              try {
                  intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
              } catch (URISyntaxException e) {
                  e.printStackTrace();
              }
              view.getContext().startActivity(intent);
          }
          else if (url.endsWith(".mp3")) {
              Intent intent = new Intent(Intent.ACTION_VIEW);
              intent.setDataAndType(Uri.parse(url), "audio/*");
              startActivity(intent);
      
          } else if (url.endsWith(".mp4") || url.endsWith(".3gp")) {
              Intent intent = new Intent(Intent.ACTION_VIEW);
              intent.setDataAndType(Uri.parse(url), "video/*");
              startActivity(intent);
          }
          else {
              return false;
          }
          view.reload();
          return true;
      }
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 2017-05-05
      • 2018-06-14
      • 1970-01-01
      • 2019-11-10
      相关资源
      最近更新 更多