Liens WebView Android «tel:» montrent la page Web introuvable

J’essaie d’obtenir mon application webview Android pour ouvrir tel: liens vers le téléphone. Chaque fois que j’ouvre une liaison 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, c’est sur une page indiquant “Page Web introuvable”: 0000000000 “. Ensuite, je dois appuyer à nouveau sur le bouton de retour pour accéder à la page sur laquelle j’ai cliqué sur le numéro de téléphone.

Y a-t-il un moyen de l’obtenir pour ouvrir le lien TEL sans essayer de trouver la page dans Webview 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, Ssortingng 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 à récurer et je n’ai pas réussi à trouver de réponse.

OK, j’ai résolu le problème je pense. Je devais juste séparer les remplacements d’URL comme suit:

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

Maintenant mes liens réguliers fonctionnent aussi bien que les liens de tél. Je peux aussi append des liens géo si besoin est et cela ne me donnera pas le problème que je rencontrais auparavant pour ouvrir des cartes au téléphone.

Plutôt que d’appeler loadUrl(url) , retournez simplement false pour les URL à ne pas remplacer:

 public boolean shouldOverrideUrlLoading(WebView view, Ssortingng url) { if( URLUtil.isNetworkUrl(url) ) { return false; } // Otherwise allow the OS to handle it Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity( intent ); return true; } 

J’ai trouvé VIEWing tel: fonctionne comme prévu sur tous les téléphones que nous avons essayés avec. Pas besoin de le spécialiser à cause de l’action DIAL.

J’ai remarqué que les vidéos YouTube et autres ne fonctionnent pas dans WebViews. Vous souhaiterez peut-être les détecter également.

L’ensemble du processus pourrait probablement être généralisé pour toutes sortes d’URI en interrogeant le PackageManager pour les activités qui gèrent votre URI qui ne sont pas non plus le navigateur intégré. Cela peut être exagéré et confus par les autres navigateurs installés.

Selon la documentation et sur la base de mon expérience, Intent.ACTION_VIEW convient parfaitement pour parsingr tel: smsto: sms: smsto: mms: et mmsto: liens.

Voici un 5 en 1:

 @Override public boolean shouldOverrideUrlLoading(WebView webview, Ssortingng url) { if (url.startsWith("tel:") || url.startsWith("sms:") || url.startsWith("smsto:") || url.startsWith("mms:") || url.startsWith("mmsto:")) { Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url)); startActivity(intent); return true; } return false; } 

Remarque: – Après Android Nouget shouldOverrideUrlLoading est shouldOverrideUrlLoading

Vous devez utiliser shouldOverrideUrlLoading avec shouldOverrideUrlLoading pour un meilleur support. Vous pouvez également vérifier si l’URL mailto: ou tel qui sont utilisés dans HTML5 pour déclencher respectivement le client de messagerie et la numérotation téléphonique.

Une solution complète ressemblera à ceci maintenant

  @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView view, Ssortingng url) { if (url.startsWith("mailto:")) { //Handle mail Urls startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse(url))); } else if (url.startsWith("tel:")) { //Handle telephony Urls startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url))); } else { view.loadUrl(url); } return true; } @TargetApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { final Uri uri = request.getUrl(); if (uri.toSsortingng().startsWith("mailto:")) { //Handle mail Urls startActivity(new Intent(Intent.ACTION_SENDTO, uri)); } else if (uri.toSsortingng().startsWith("tel:")) { //Handle telephony Urls startActivity(new Intent(Intent.ACTION_DIAL, uri)); } else { //Handle Web Urls view.loadUrl(uri.toSsortingng()); } return true; } 

Si WebViewClient n’est pas atsortingbué à WebView, WebView par défaut demande à Activity Manager de choisir le gestionnaire approprié pour l’URL. Si un WebViewClient est fourni, vous devez gérer vous-même différentes URL et retourner true dans WebViewClient.shouldOverrideUrlLoading (), sinon il essaiera d’envoyer une requête à l’URL et de recevoir une erreur, puis des déclencheurs onReceiveError ().

Document de vérification: WebViewClient.shouldOverrideUrlLoading

  @Override public boolean shouldOverrideUrlLoading(WebView view, Ssortingng 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; } } 
 public class MainActivity extends Activity { private static final Ssortingng HTML ="Click here to call!"; private static final Ssortingng TEL_PREFIX = "tel:"; @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 { @Override public boolean shouldOverrideUrlLoading(WebView wv, Ssortingng url) { if(url.startsWith(TEL_PREFIX)) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse(url)); startActivity(intent); return true; } return false; } } } 

C’était le correctif que j’ai trouvé. Vous devez utiliser cette méthode.

 wv.setWebViewClient(new CustomWebViewClient()); 
 public boolean shouldOverrideUrlLoading(WebView view, Ssortingng url) {Uri query_ssortingng=Uri.parse(url); Ssortingng query_scheme=query_ssortingng.getScheme(); Ssortingng query_host=query_ssortingng.getHost(); if ((query_scheme.equalsIgnoreCase("https") || query_scheme.equalsIgnoreCase("http")) && query_host!=null && query_host.equalsIgnoreCase(Uri.parse(URL_SERVER).getHost()) && query_ssortingng.getQueryParameter("new_window")==null ) {return false;//handle the load by webview } try {Intent intent=new Intent(Intent.ACTION_VIEW, query_ssortingng); Ssortingng[] 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; } 
 @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, Ssortingng url) { if(url.startsWith(TEL_PREFIX)) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse(url)); startActivity(intent); return true; } return false; }