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?
- vista web android con conexión https y autenticación básica. ¿Cómo conseguir este trabajo?
- Android adjustResize - Cómo deshabilitar el efecto de fundido
- Cargando el archivo html desde la carpeta local en la vista web
- Android WebView deja espacio para la barra de desplazamiento
- Configuración de Url a un WebView
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.
- Reaccionar WebView nativo html <select> no abre opciones en tablets Android
- Obtener ancho y altura disponible fiable con javascript
- Google Maps lento en WebView de Android 2.2 cuando se utilizan transformaciones CSS3
- ¿Cómo obtener la funcionalidad de la cámara en la vista web de Android?
- Cargando url con pdf en monodroid webview
- Cómo eliminar los botones de zoom en la vista web de Android?
- La selección de WebView hace que el teclado virtual se oculte temporalmente y luego regrese
- Android: WebView shouldInterceptRequest no agregar RequestProperties en el WebView
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 descartar un DialogFragment al presionar fuera del cuadro de diálogo?
- Ciclo de vida de la clase de aplicaciones Android