Android WebView err_unknown_url_scheme

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

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

@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.


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