Manejo de vínculos en una vista web
Tengo mi WebView
cargando todos los enlaces dentro de la webview, pero cuando selecciono un enlace de correo electrónico, intenta cargarlo en la vista web en lugar de iniciar una aplicación de correo electrónico en el teléfono. ¿Cómo resuelvo eso? Los enlaces son mailto: //[email protected]
Aquí está mi código: el propio WebView
funciona correctamente y todo se carga dentro de la webview, incluyendo mailto :, etc. Necesita los enlaces mailto para cargar en otra parte
- Cordova WebView TIMEOUT ERROR con android
- Cargar archivos html desde la carpeta raw en la vista web
- Android webview tiene borde blanco alrededor de él y cómo puedo deshacerme de él?
- Capturar la página redirecciona vía javascript en WebView de Android
- Cómo deshabilitar el desplazamiento vertical de la vista web para cargar la página entera como columna diferente
package com.apps.jerdog.crcc; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.KeyEvent; import android.webkit.WebView; import android.webkit.WebViewClient; @SuppressWarnings("unused") public class mainActivity extends Activity { /** Called when the activity is first created. */ /**@Override */ WebView webview; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); webview = (WebView) findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); webview.getSettings().setSupportZoom(true); webview.getSettings().setBuiltInZoomControls(true); webview.setWebViewClient(new WebViewClient()); webview.loadUrl("http://www.cedarridge.cc"); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { webview.goBack(); return true; } return super.onKeyDown(keyCode, event); } private class myWebViewClient extends WebViewClient { 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; } }}
- Android WebViewClient: Cómo obtener el cuerpo de solicitud de POST
- ¿Cómo obtener la funcionalidad de la cámara en la vista web de Android?
- Tire para actualizar para WebView
- Cómo jugar vimeo video usando iframe en la vista web?
- ¿Por qué no Webview de Android verifica la caché por defecto?
- Cómo interceptar url cargas en WebView (android)?
- Cómo cargar el archivo html almacenado dentro de la tarjeta SD en la vista web
- Cómo pasar JSONArray de la actividad a Html Script?
Supongo que ya están anulando shouldOverrideUrlLoading, sólo tiene que manejar este caso especial.
mWebClient = new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if(url.startsWith("mailto:")){ MailTo mt = MailTo.parse(url); Intent i = newEmailIntent(MyActivity.this, mt.getTo(), mt.getSubject(), mt.getBody(), mt.getCc()); startActivity(i); view.reload(); return true; } else{ view.loadUrl(url); } return true; } }; mWebView.setWebViewClient(mWebClient); public static Intent newEmailIntent(Context context, String address, String subject, String body, String cc) { Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, new String[] { address }); intent.putExtra(Intent.EXTRA_TEXT, body); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_CC, cc); intent.setType("message/rfc822"); return intent; }
Saliendo de la respuesta proporcionada por @schwiz, aquí hay un ejemplo más limpio. Suponiendo que el WebView
se denomina webView
:
webView.setWebViewClient(new WebViewClient() { // shouldOverrideUrlLoading makes this `WebView` the default handler for URLs inside the app, so that links are not kicked out to other apps. @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // Use an external email program if the link begins with "mailto:". if (url.startsWith("mailto:")) { // We use `ACTION_SENDTO` instead of `ACTION_SEND` so that only email programs are launched. Intent emailIntent = new Intent(Intent.ACTION_SENDTO); // Parse the url and set it as the data for the `Intent`. emailIntent.setData(Uri.parse(url)); // `FLAG_ACTIVITY_NEW_TASK` opens the email program in a new task instead as part of this application. emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Make it so. startActivity(emailIntent); return true; } else { // Load the URL in `webView`. webView.loadUrl(url); return true; } } });
He probado esto con todas las opciones mailto:
varias direcciones de correo electrónico, CC, BCC, asunto y cuerpo.
:::: :::: webViewTerms = (WebView) v .findViewById(R.id.webview_termsAndCond); webViewTerms.setWebViewClient(new Client()); webViewTerms.getSettings().setJavaScriptEnabled(true); //webViewTerms.getSettings().setBuiltInZoomControls(true); webViewTerms.loadUrl(getUrl()); //.loadUrl("https://www.google.com/"); :::: :::: :::: private class Client extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { // TODO Auto-generated method stub super.onPageFinished(view, url); } }
- Checkbox auto call onCheckedChange cuando se desplaza el listview?
- La barra de estado de Android espera iconos de tamaño 25x25dp mientras que las pautas recomiendan 32x32dp. ¿Quién está equivocado?