Android Intent Chooser para mostrar solo la opción de correo electrónico
Mi aplicación integra el correo electrónico donde el usuario puede enviar un informe de error, comentarios, etc. desde la aplicación directamente. Estoy usando la aplicación / octet-stream como el tipo de configuración para la Intent. Cuando vas a enviar el correo electrónico, obtienes el selector de contenido y muestra varios elementos de Evernote, Facebook,correo electrónico, etc.
¿Cómo puedo conseguir que este selector solo muestre el correo electrónico para no confundir al usuario con todos estos otros elementos que se ajustan al tipo de selector de contenido?
Gracias.
8 answers
Estoy presumiendo que usted está utilizando el ACTION_SEND
Intent
acción, ya que no te molestaste en declarar realmente lo que estás usando, pero estás de acuerdo con el comentario de @Aleadam.
Estoy usando la aplicación/octet-stream como el tipo de configuración para la Intent.
Nada en esa oración limita las cosas al correo electrónico.
ACTION_SEND
es una acción genérica Intent
que puede ser soportada por cualquier aplicación que lo desee. Todo lo que hace es indicar qué datos está compartiendo y el tipo MIME de los mismos datos from a partir de ahí, depende del usuario elegir entre las actividades disponibles.
Como @Jasoon indica, puede probar message/rfc822
como el tipo MIME. Sin embargo, eso no indica "solo ofrecer clientes de correo electrónico" indicates indica "ofrecer cualquier cosa que soporte datos message/rfc822
". Eso podría incluir fácilmente alguna aplicación que no son clientes de correo electrónico.
Si específicamente desea enviar algo por correo electrónico, integre JavaMail en su aplicación o escriba un script de reenvío de correo electrónico en su servidor web y invócalo, o algo así. Si utiliza ACTION_SEND
, está indicando implícitamente que lo que importa es lo que el usuario quiere, y desea que el usuario pueda enviar tales y otros datos por cualquier medio que elija.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-06 19:48:33
Resolví este problema con simples líneas de código como se explica en la documentación de Android ( https://developer.android.com/guide/components/intents-common.html#Email )
El más importante es El de la bandera: es ACTION_SENDTO
, y no ACTION_SEND
La otra línea importante es
intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***
Por cierto, si envías un Extra
vacío, el if()
al final no funcionará y la aplicación no iniciará el cliente de correo electrónico.
Esto funciona para mí. Según Android documentación. Si quieres asegurarte de que tu intent solo sea manejada por una aplicación de correo electrónico (y no por otras aplicaciones de mensajería de texto o redes sociales), usa la acción ACTION_SENDTO e incluye el esquema de datos "mailto:". Por ejemplo:
public void composeEmail(String[] addresses, String subject) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, addresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-06 11:22:00
Acabo de tener problemas con este problema al implementar una función de Enlace Mágico, una intención de selector para todas las aplicaciones de correo electrónico instaladas:
Captura de pantalla de Intención del selector
private void openEmailApp() {
List<Intent> emailAppLauncherIntents = new ArrayList<>();
//Intent that only email apps can handle:
Intent emailAppIntent = new Intent(Intent.ACTION_SENDTO);
emailAppIntent.setData(Uri.parse("mailto:"));
emailAppIntent.putExtra(Intent.EXTRA_EMAIL, "");
emailAppIntent.putExtra(Intent.EXTRA_SUBJECT, "");
PackageManager packageManager = getPackageManager();
//All installed apps that can handle email intent:
List<ResolveInfo> emailApps = packageManager.queryIntentActivities(emailAppIntent, PackageManager.MATCH_ALL);
for (ResolveInfo resolveInfo : emailApps) {
String packageName = resolveInfo.activityInfo.packageName;
Intent launchIntent = packageManager.getLaunchIntentForPackage(packageName);
emailAppLauncherIntents.add(launchIntent);
}
//Create chooser
Intent chooserIntent = Intent.createChooser(new Intent(), "Select email app:");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, emailAppLauncherIntents.toArray(new Parcelable[emailAppLauncherIntents.size()]));
startActivity(chooserIntent);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-01 15:13:06
Hay una forma más genérica de hacer eso, trabajando con cualquier tipo MIME.
Ver esta publicación: ¿Cómo personalizar la intención de compartir en Android?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:54
Funciona en todos los dispositivos. Mostrará solo Aplicaciones de correo electrónico
public static void shareViaMail(Activity activity, String title, String body, String filePath) {
Uri URI = Uri.parse("file://" + filePath);
final Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
if (URI != null) {
emailIntent.putExtra(Intent.EXTRA_STREAM, URI);
}
try {
activity.startActivity(emailIntent);
} catch (Exception e) {
((BaseActivity) activity).showToast("Gmail App is not installed");
e.printStackTrace();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-25 15:45:25
Es posible limitar las opciones de un selector de intent a solo unas pocas opciones. El código en la respuesta a esta pregunta es un buen ejemplo. En esencia, tendría que crear una Lista de LabeledIntents para proporcionar al selector de intenciones, que luego lo incluirá en su lista. Tenga en cuenta que esta solución no funciona con exclusión (algunas aplicaciones se excluyen mientras que el resto permanece), sino que tiene que elegir qué aplicaciones mostrar. Espero que ayude!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:30:59
Funciona en todos devices.It mostrará solo Aplicaciones de correo electrónico
public static void shareViaMail(Activity activity, String title, String body, String filePath) {
Uri URI = Uri.parse("file://" + filePath);
final Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
/*if you want to attach something*/
if (URI != null) {
emailIntent.putExtra(Intent.EXTRA_STREAM, URI);
}
try {
activity.startActivity(emailIntent);
} catch (Exception e) {
((BaseActivity) activity).showToast("Gmail App is not installed");
e.printStackTrace();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-15 01:33:34
La Solución es muy simple:
Intent testIntent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("mailto:?subject=" + "blah blah subject" + "&body=" + "blah blah body" + "&to=" + "[email protected]");
testIntent.setData(data);
startActivity(testIntent);
Véase: http://www.gaanza.com/blog/email-client-intent-android /
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-15 21:38:09