manejo de enlaces en una vista web

Tengo mi WebView cargando todos los enlaces dentro de la vista web, pero cuando selecciono un enlace de correo electrónico, intenta cargarlo en la vista web en lugar de abrir una aplicación de correo electrónico en el teléfono. ¿Cómo lo resuelvo? los enlaces son mailto: //someone@somewhere.com

Aquí está mi código: la WebView funciona bien y todo se carga dentro de la vista web, incluido mailto :, etc. Necesita los enlaces de mailto para cargar en otro lugar

 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á invalidando shouldOverrideUrlLoading, solo necesita 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 WebView se llame 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 { // Returning false causes WebView to load the URL while preventing it from adding URL redirects to the WebView history. return false; } } }); 

He probado esto con todas las opciones de mailto: múltiples 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); } }