web-dev-qa-db-fra.com

Android WebView err_unknown_url_scheme

Avec le simple code ci-dessous, je peux obtenir mon URL chargée correctement, mais je reçois le message "ERR_UNKNOWN_URL_SCHEME" lorsque j'essaie d'exploiter les liens html commençant par mailto: whatsapp: et tg: ( Télégramme).

Quelqu'un peut m'aider à résoudre ce problème s'il vous plaît? Malheureusement, je ne connais pas du tout Java :(

Merci.

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

Vous devez définir un client dans la vue Web et les transmettre à une intention.

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

    });
}

Vous pouvez avoir une méthode pour vérifier si l'application est installée

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

        return false;
    }
8
Cristian Gomez

En fait, WebView ne fonctionne pas avec les schémas d'URL tels que mailto, tg, sms, phone. Vous devez remplacer la méthode shouldOverrideUrlloading () et faire ce que votre vue Web doit faire lorsque ce type de système est trouvé.

 @Override
        public boolean shouldOverrideUrlLoading(WebView view, String  url)
        {

            if( URLUtil.isNetworkUrl(url) )
            {
                return false;
            }
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(url));
                startActivity(intent);

            }catch(ActivityNotFoundException e)
            {
                Log.e("AndroiRide",e.toString());
                Toast.makeText(MainActivity.this,"No activity found",Toast.LENGTH_LONG).show();
            }

            return true;
        }

shouldOverrideUrlLoading (vue WebView, String url) était obsolète dans le niveau 24 de l'API. 

Donc, remplacez public boolean shouldOverrideUrlLoading (vue WebView, demande WebResourceRequest)

@RequiresApi(Build.VERSION_CODES.N)
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
        {
            String url=request.getUrl().toString();
            if( URLUtil.isNetworkUrl(url) )
            {
                return false;
            }
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(url));
                startActivity(intent);

            }catch(ActivityNotFoundException e)
            {
                Log.e("AndroiRide",e.toString());
                Toast.makeText(MainActivity.this,"No activity found",Toast.LENGTH_LONG).show();
            }

            return true;
        }

Personnalisez le code si vous créez vos propres schémas . Plus d'infos [Code Kotlin & Java]

2
c49

Vous devez remplacer la méthode shouldOverrideUrlLoading de WebViewClient dans laquelle vous pouvez contrôler vous-même le transfert de lien. 

Étant donné que html links that starts with mailto: whatsapp: and tg: (Telegram). n’est pas une URL commune, commencez par «http: //» ou «https: //». WebView ne peut donc pas l’analyser au bon endroit. Nous devrions utiliser l’intention de rediriger l’URL. 

Par exemple:

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

puis définissez WebViewClient sur votre WebView, comme ceci:

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

Les liens mailto ne seront pas chargés dans votre webview.Vous devez le vérifier comme ceci dans shouldOverrideUrlLoading et le manipuler avec 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;
    }
  }

Question similaire Android Webview ERR_UNKNOWN_URL_SCHEME Erreur

0
sunil sunny