Enlace de correo electrónico de Webview (mailto)

Tengo una vista y ver el sitio tiene código malito para enviar correo electrónico. Cuando abro el enlace se abre con un error. Quiero que cuando abro el enlace abra la aplicación de Gmail u otra aplicación de correo electrónico. Gracias a todos los ayudantes.

public class teacher extends Activity implements OnClickListener { WebView webView; final Activity activity = this; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.getWindow().requestFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.teacher); webView = (WebView) findViewById(R.id.webView145); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl("https://dl.dropboxusercontent.com/u/233211/%D7%A8%D7%A9%D7%99%D7%95%D7%9F/iWebKit%20demo/ther.html"); webView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { activity.setTitle("Loading..."); activity.setProgress(progress * 100); if (progress == 100) activity.setTitle(R.string.app_name); } }); webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // Handle the error } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });} public void onBackPressed() { if (webView.canGoBack()) { webView.goBack(); } else { Intent B = new Intent(this, MainActivity.class); startActivity(B); }} @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: if (webView.canGoBack() == true) { webView.goBack(); } else { finish(); }return true;} } return super.onKeyDown(keyCode, event); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub }} 

Debe crear una subclase de WebViewClient y reemplazar la carga de URL de mailto. Ejemplo:

 public class MyWebViewClient extends WebViewClient { private final WeakReference<Activity> mActivityRef; public MyWebViewClient(Activity activity) { mActivityRef = new WeakReference<Activity>(activity); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("mailto:")) { final Activity activity = mActivityRef.get(); if (activity != null) { MailTo mt = MailTo.parse(url); Intent i = newEmailIntent(activity, mt.getTo(), mt.getSubject(), mt.getBody(), mt.getCc()); activity.startActivity(i); view.reload(); return true; } } else { view.loadUrl(url); } return true; } private 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; } } 

Entonces usted tiene que fijar este WebViewClient personalizado a su WabView:

 webView.setWebViewClient(new MyWebViewClient(activity); 

Debería cambiar shouldOverrideUrlLoading de WebViewClient a lo siguiente:

  public boolean shouldOverrideUrlLoading(WebView view, String url) { if(url.startsWith("mailto:")){ Intent i = new Intent(Intent.ACTION_SENDTO, Uri.parse(url)); startActivity(i); } else{ view.loadUrl(url); } return true; } 

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

Necesita utilizar shouldOverrideUrlLoading junto con shouldOverrideUrlLoading para un mejor soporte.

Además, es posible que desee comprobar si la dirección 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; } 
  • Fuerza de la pantalla WebView para dibujar
  • Android: Guardar XWalkView - Estado de la pasarela
  • Cómo trabajar con ventanas emergentes ventana en android webview
  • En appcelerator / titanium mobile, al usar html local en una vista web, ¿cómo puedo cargar una imagen desde y hacer referencia al directorio de datos de la aplicación
  • WebViewClient que no llama shouldOverrideUrlLoading
  • Cómo utilizar una fuente personalizada con WebView
  • Android - Añadir GestureDetector a la vista web
  • WebView y HTML5 <video>
  • Redirigir la vista web de Android con el filtro de intenciones
  • Rendimiento de la vista web de Android a bitmap, html5 javascript, problema de devolución de llamada
  • Cómo mostrar Cierta Parte de WebPage dentro de Webview Con Fit Screen a Todos los Dispositivos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.