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.

Author: Neal, 2011-06-06

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.

 13
Author: CommonsWare,
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);
    }
}
 27
Author: Pedro Varela,
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);
}
 5
Author: Fisk Debug,
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?

 2
Author: Derzu,
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();
    }
}
 1
Author: Sonia Rana,
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!

 0
Author: DudeSurfer,
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();
        }
}
 0
Author: Sonia Rana,
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 /

 0
Author: Volodymyr T,
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