WebView Android "tel:" enlaces muestran página web no encontrada

Estoy tratando de obtener mi aplicación webview android para abrir tel: enlaces al teléfono. Cada vez que abrir un enlace telefónico funciona muy bien y abre el teléfono. Sin embargo, una vez que estoy hecho con mi llamada y volver a la aplicación es en una página que dice "Página Web no encontrada tel: 0000000000". Entonces tengo que golpear el botón de vuelta una vez más para conseguir a la página que chasqué el número de teléfono encendido.

¿Hay una manera de conseguir que abra el enlace de TEL sin tratar de encontrar la página en webview, así como abrirlo en el teléfono?

Este es el código que estoy usando en WebView para anular su manejo de los enlaces TEL y 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; } 

Cualquier ayuda sería apreciada. He pasado las últimas 2 horas fregando goodle y no he podido producir ninguna respuesta.

OK, así que he resuelto el problema, creo. Solo necesitaba separar las anulaciones de URL de la siguiente manera:

 public boolean shouldOverrideUrlLoading(WebView view, String 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; } 

Ahora mis enlaces regulares funcionan tan bien como los acoplamientos del tel. También puedo añadir allí para geo: enlaces si es necesario y no me dará el problema que tenía antes de abrir mapas en el teléfono.

En lugar de llamar a loadUrl(url) , devuelve false para las URL que no se deben sobreescribir:

 public boolean shouldOverrideUrlLoading(WebView view, String 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; } 

He encontrado VIEWing tel: funciona como se espera en todos los teléfonos que hemos probado con. No hay necesidad de caso especial, debido a la acción DIAL.

He notado que los videos de YouTube y similares no funcionan en WebViews, por lo que es posible que desee detectarlos también.

Todo el proceso probablemente podría generalizarse para todo tipo de URI al consultar el PackageManager para las Actividades que manejan su URI que tampoco son el explorador integrado. Eso podría ser excesivo y confundirse con otros navegadores instalados.

De acuerdo con la documentación y basado en mi experiencia, Intent.ACTION_VIEW está perfectamente bien para analizar tel: sms: smsto: mms: y mmsto: enlaces.

Aquí hay un 5 en 1:

 @Override public boolean shouldOverrideUrlLoading(WebView webview, String 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; } 

Si no hay WebViewClient asignado a WebView, de forma predeterminada WebView le pedirá a Activity Manager que elija el controlador adecuado para la URL. Si se proporciona un WebViewClient, debe manejar diferentes URLs y devuelve true en WebViewClient.shouldOverrideUrlLoading (), de lo contrario intentará enviar una solicitud a la URL y recibirá un error, luego activará onReceiveError ().

Documento de comprobación: 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; } } 
 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; } 

Nota: – Después de que Android Nouget shouldOverrideUrlLoading está desactivado

Necesita utilizar shouldOverrideUrlLoading junto con shouldOverrideUrlLoading para un mejor soporte. También es posible que desee comprobar si url tiene mailto: o tel :, que se utilizan en HTML5 para activar el cliente de correo y marcar el teléfono respectivamente.

Una solución completa se verá así ahora

  @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView view, String 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.toString().startsWith("mailto:")) { //Handle mail Urls startActivity(new Intent(Intent.ACTION_SENDTO, uri)); } else if (uri.toString().startsWith("tel:")) { //Handle telephony Urls startActivity(new Intent(Intent.ACTION_DIAL, uri)); } else { //Handle Web Urls view.loadUrl(uri.toString()); } return true; } 
  • Cómo configurar el zoom / ancho inicial para una vista web
  • Bloquear determinadas URL de seguridad en la vista web de Android
  • Android: el método de WebView goBack () muestra una página en blanco
  • Cómo cargar URL en Android Web View si HTTP o HTTPS no se incluyen en la URL dada
  • Inicia sesión de Google en la aplicación sin agregarla a las cuentas de dispositivos
  • WebView en Android 4.4 y escala inicial
  • Obtener la altura del texto incluyendo el tamaño de fuente y establecer esa altura
  • No se puede obtener la URL actual del evento de clic de WebView en Android
  • Para mostrar una página html estática en android
  • Android - ¿por qué webview redireccionar a webbrowser
  • Android 4.4 KitKat accidente aleatorio (Native crash en /system/lib/libc.so)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.