Android WebView err_unknown_url_scheme

后端 未结 5 687
花落未央
花落未央 2020-11-27 05:11

With the simple below code I can get my url loaded correctly, but, I get \"ERR_UNKNOWN_URL_SCHEME\" when trying to tap on html links that starts with mailto: wh

相关标签:
5条回答
  • 2020-11-27 05:49

    This Work For Me

    "webview.setWebViewClient(new WebViewClient() { String 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
    
    0 讨论(0)
  • 2020-11-27 05:58

    mailto links will not get loaded in your webview.You have check for it like this in shouldOverrideUrlLoading and handle it with 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;
        }
      }
    

    Similar question Android Webview ERR_UNKNOWN_URL_SCHEME Error

    0 讨论(0)
  • 2020-11-27 05:59
    @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;
            }
    

    Put this code in your mWebView.setWebViewClient(new WebViewClient(). it will be working perfectly for all link like tel:, whatsapp:, mailto: etc.

    0 讨论(0)
  • 2020-11-27 06:00

    You have to set a client in the webview and pass these to an intent

    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;
            }
    
        });
    }
    

    You can have a method to check if app is installed

    private boolean appInstalledOrNot(String uri) {
            PackageManager pm = getPackageManager();
            try {
                pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
                return true;
            } catch (PackageManager.NameNotFoundException e) {
            }
    
            return false;
        }
    
    0 讨论(0)
  • 2020-11-27 06:10

    You need override the method shouldOverrideUrlLoading of WebViewClient in which you can control link transfer by yourself.

    Because html links that starts with mailto: whatsapp: and tg: (Telegram). is not common url start with "http://" or "https://", so WebView cannot parse it to right place, we should use intent to redirect the url.

    For example:

            @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;
                }
            }
    

    then setWebViewClient to your WebView, like this:

    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");
    }}
    
    0 讨论(0)
提交回复
热议问题