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

 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; } }} 

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); } } 
  • Cómo utilizar el token de acceso de Facebook en la vista de la aplicación de Android
  • ¿Qué significa "instalar plugin de Flash" en WebView?
  • JellyBean Webview se centrará automáticamente elemento html con resaltar cuando navegue con el teclado y no se puede desactivar
  • ¿Hay alguna manera de interceptar JavaScript activado URL en webview?
  • Webview no puede cargar https url en android?
  • ¿Cómo puedo utilizar los efectos de transición de Android en la vista web?
  • ¿Cómo implementar CordovaInterface para que pueda usar la cámara en la webview?
  • ¿Cómo puedo validar un android.net.http.SsLCertificate con un X509TrustManager?
  • Android.view.WindowManager $ BadTokenException
  • Android móvil twitter página en webview no abrir?
  • El video de youtube no se reproduce en android webview de iframe
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.