android - intents - intent filter para que sirve
Cómo abrir el programa de correo electrónico a través de Intents(pero solo un programa de correo electrónico) (7)
Quiero configurar una parte de mi aplicación que permita a los usuarios enviar un correo electrónico rápido a otro usuario. No es muy difícil configurar esto:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, message);
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);
Sin embargo, el problema es que ACTION_SEND es aceptado por más que solo programas de correo electrónico; por ejemplo, en mi teléfono, la aplicación de Facebook, Twitter, reddit es divertido, e incluso el Bluetooth aparece como una alternativa viable para enviar este mensaje. El mensaje es demasiado extenso para algunos de ellos (especialmente Twitter).
¿Hay alguna manera de limitar el selector a solo las aplicaciones que admiten mensajes largos (como el correo electrónico)? ¿O hay una forma de detectar la aplicación que el usuario ha elegido y ajustar el mensaje de forma adecuada?
¿Has intentado incluir el Intent.EXTRA_EMAIL
extra?
Intent mailer = new Intent(Intent.ACTION_SEND);
mailer.setType("text/plain");
mailer.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
mailer.putExtra(Intent.EXTRA_SUBJECT, subject);
mailer.putExtra(Intent.EXTRA_TEXT, bodyText);
startActivity(Intent.createChooser(mailer, "Send email..."));
Eso puede restringir la lista de aplicaciones de receptor disponibles ...
Cambiar el tipo MIME es la respuesta, esto es lo que hice en mi aplicación para cambiar el mismo comportamiento. intent.setType("message/rfc822");
Esto es un poco un error tipográfico, ya que necesita cambiar su tipo MIME:
intent.setType("plain/text"); //Instead of "text/plain"
Esto funcionó para mí
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("vnd.android.cursor.item/email");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {"[email protected]"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Email Subject");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "My email content");
startActivity(Intent.createChooser(emailIntent, "Send mail using..."));
Gracias a la sugerencia de Pentium10 de buscar cómo funciona Linkify, he encontrado una gran solución a este problema. Básicamente, simplemente crea un enlace "mailto:" y luego llama al Intento apropiado para eso .:
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("mailto:?subject=" + subject + "&body=" + body);
intent.setData(data);
startActivity(intent);
Hay algunos aspectos interesantes en esta solución:
Estoy usando la acción ACTION_VIEW porque es más apropiado para un enlace "mailto:". No podría proporcionar ninguna acción particular, pero luego podría obtener algunos resultados insatisfactorios (por ejemplo, le preguntará si desea agregar el enlace a sus contactos).
Como este es un enlace de "compartir", simplemente no incluyo ninguna dirección de correo electrónico, aunque este es un enlace de correo electrónico. Funciona.
No hay un selector involucrado. La razón para esto es permitir que el usuario aproveche los valores predeterminados; si han configurado un programa de correo electrónico predeterminado, entonces los llevará directamente a eso, evitando por completo el selector (lo cual me parece bien en mi mente, puede argumentar lo contrario).
Por supuesto, hay mucha delicadeza que estoy dejando de lado (como codificar correctamente el tema / cuerpo), pero deberías ser capaz de resolverlo por tu cuenta.
Intente cambiar el tipo MIME de simple a mensaje
intent.setType("text/message");
prueba esta opción:
Intent intentEmail = new Intent(Intent.ACTION_SEND);
intentEmail.setType("message/rfc822");