69 votes

Les liens "tel :" des WebViews Android affichent une page web non trouvée

J'essaie de faire en sorte que mon application Android webview ouvre les liens tel : sur le téléphone. Chaque fois que j'ouvre un lien téléphonique, cela fonctionne très bien et ouvre le téléphone. Cependant, une fois que j'ai terminé mon appel et que je reviens à l'application, celle-ci se trouve sur une page qui dit "Web Page Not Found tel:0000000000". Je dois alors appuyer une nouvelle fois sur le bouton Précédent pour revenir à la page où j'ai cliqué sur le numéro de téléphone.

Existe-t-il un moyen d'ouvrir le lien TEL sans essayer de trouver la page dans la vue Web et de l'ouvrir sur le téléphone ?

C'est le code que j'utilise dans WebView pour remplacer sa gestion des liens TEL et Mailto :

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("mailto:") || url.startsWith("tel:")) { 
                Intent intent = new Intent(Intent.ACTION_VIEW,
                        Uri.parse(url)); 
                startActivity(intent); 
                } 
        view.loadUrl(url);
        return true;
        }

Toute aide serait appréciée. J'ai passé les deux dernières heures à parcourir Goodle et je n'ai trouvé aucune réponse.

1 votes

Essayez ACTION_DIAL pour le lien tel: ?

0 votes

Attendez, la documentation dit en fait que ACTION_VIEW est bien : developer.Android.com/reference/Android/content/Intent.html Peu importe alors...

0 votes

Question stupide : As-tu configuré le WebViewClient correctement ? Est-ce que tout le reste fonctionne ?

3voto

evanchin Points 359

Si aucun WebViewClient n'est attribué à WebView, par défaut, WebView demandera au gestionnaire d'activité de choisir le gestionnaire approprié pour l'URL. Si un WebViewClient est fourni, vous devez gérer vous-même les différentes URL et retourner true dans WebViewClient.shouldOverrideUrlLoading(), sinon il essaiera d'envoyer une requête à l'URL et obtiendra une erreur, puis déclenchera onReceiveError().

Vérifier le document : WebViewClient.shouldOverrideUrlLoading

     @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("tel:")) { 
            // ...TODO: launch a Dial app or send SMS or add to contact, etc...
            return true;
        }
        else if (url.startsWith("mailto:")) {
            // ...TODO: send email to someone or add to contact, etc...
            return true;
        }
        else {
            // ...TODO: Handle URL here
            boolean handled = yourHandleUrlMethod(url);
            return handled;
        }
    }

1voto

diyism Points 1191
public boolean shouldOverrideUrlLoading(WebView view, String url)
       {Uri query_string=Uri.parse(url);
        String query_scheme=query_string.getScheme();
        String query_host=query_string.getHost();
        if ((query_scheme.equalsIgnoreCase("https") || query_scheme.equalsIgnoreCase("http"))
            && query_host!=null && query_host.equalsIgnoreCase(Uri.parse(URL_SERVER).getHost())
            && query_string.getQueryParameter("new_window")==null
           )
           {return false;//handle the load by webview
           }
        try
           {Intent intent=new Intent(Intent.ACTION_VIEW, query_string);
            String[] body=url.split("\\?body=");
            if (query_scheme.equalsIgnoreCase("sms") && body.length>1)
               {intent=new Intent(Intent.ACTION_VIEW, Uri.parse(body[0]));
                intent.putExtra("sms_body", URLDecoder.decode(body[1]));
               }
            view.getContext().startActivity(intent);//handle the load by os
           }
        catch (Exception e) {}
        return true;
       }

1 votes

Pourriez-vous expliquer un peu votre solution ? En particulier, le test avec l'URL_SERVER (qui est manquant, d'ailleurs) pourrait ne pas être clair pour tout le monde.

0 votes

URL_SERVER est " votre.app.domaine.com ", et "return false ;" signifie que les pages de votre site seront ouvertes dans l'application et ne seront pas ouvertes dans le navigateur Android.

1voto

javakam Points 61

Certaines constantes sont statiques dans WebView classe. Vous devez utiliser Intent.ACTION_VIEW au lieu de Intent.ACTION_DIAL ou ACTION_SENDTO :

@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    String url = request.getUrl().toString();
    if (url.startsWith(WebView.SCHEME_TEL)
            || url.startsWith(SCHEME_SMS)
            || url.startsWith(WebView.SCHEME_MAILTO)
            || url.startsWith(WebView.SCHEME_GEO)) {

        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));
        startActivity(intent); // view.context.startActivity(intent);
    }
    return true;
}

0voto

Naju Mat Isa Points 15
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) findViewById(R.id.webview);
    wv.setWebViewClient(new CustomWebViewClient());
    wv.loadData(HTML, "text/html", "utf-8");
}

private class CustomWebViewClient extends WebViewClient {
    @SuppressWarnings("deprecated")
    @Override
    public boolean shouldOverrideUrlLoading(WebView wv, String url) {
        if(url.startsWith(TEL_PREFIX)) {
            Intent intent = new Intent(Intent.ACTION_DIAL);
            intent.setData(Uri.parse(url));
            startActivity(intent);
            return true;
        }
        return false;
    }

0 votes

J'ai essayé d'utiliser cette méthode postée ci-dessus, mais quand j'ai ajouté "shouldoverrideurlloading", il y a une erreur disant que cette méthode est dépréciée. y a-t-il une restriction de l'API pour utiliser ce code ? J'ai essayé d'installer ceci dans mon téléphone mais, l'application se tue d'elle-même. Comment puis-je résoudre ce problème ?..s'il vous plaît aider

0voto

Alireza Points 1104

Pour ceux qui ont essayé d'utiliser la réponse de @jeff Thomas mais ont obtenu l'erreur suivante :

cannot find symbol view.startActivity(intent);

Vous pouvez utiliser ce code :

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith("tel:")) { 
        Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); 
        view.getContext().startActivity(intent);
        view.reload();
        return true;
    }

    view.loadUrl(url);
    return true;
}

Je viens de changer startActivity(intent) à view.getContext().startActivity(intent) et ça a marché pour moi.

0 votes

D'accord. Vous pouvez aussi envelopper startActivity sur try-catch bloc. view.reload(); n'est pas nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X