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 ?

0voto

CoolMind Points 11

Regarder Hitesh Sahu et kam C réponds que j'ai une solution.

Dans l'API 21, il a soulevé une exception : "Android.util.AndroidRuntimeException : L'appel de startActivity() depuis l'extérieur d'un contexte d'activité nécessite le drapeau FLAG_ACTIVITY_NEW_TASK. Est-ce vraiment ce que vous voulez ?".

Il se peut également qu'une activité ne soit pas trouvée, comme l'a remarqué l'équipe de l'UE. diyisme . Donc, j'ai géré ces situations.

class MyWebViewClient : WebViewClient() {

    @Suppress("DEPRECATION")
    override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
        if (view != null && url != null) {
            return resolveUri(view.context, Uri.parse(url))
        }
        return super.shouldOverrideUrlLoading(view, url)
    }

    @TargetApi(Build.VERSION_CODES.N)
    override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
        val uri = request?.url
        if (view != null && uri != null) {
            return resolveUri(view.context, uri)
        }
        return super.shouldOverrideUrlLoading(view, request)
    }

    private fun resolveUri(context: Context, uri: Uri): Boolean {
        val url = uri.toString()
        URL_SCHEMES.forEach {
            if (url.startsWith(it)) {
                val intent = Intent(Intent.ACTION_VIEW).apply {
                    data = uri
                    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                }
                try {
                    context.startActivity(intent)
                } catch (e: ActivityNotFoundException) {
                }
                return true
            }
        }
        return false
    }

    companion object {
        private val URL_SCHEMES = arrayOf(WebView.SCHEME_TEL,
            WebView.SCHEME_MAILTO, WebView.SCHEME_GEO, "sms:", "smsto:", "mms:", "mmsto:")
    }
}

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