Android vários anexos de e-mail usando o Intent

98

Tenho trabalhado no programa Android para enviar e-mail com um anexo (arquivo de imagem, arquivo de áudio, etc) usando o Intent com ACTION_SEND. O programa está funcionando quando o email tem um único anexo. Eu costumava Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)anexar o arquivo de imagem designado ao e-mail e está funcionando bem, o e-mail pode ser entregue através do Gmail. No entanto, quando tentei anexar várias imagens ao mesmo e-mail, ligando Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)várias vezes, não funcionou. Nenhum anexo aparece no e-mail.

Pesquisei a documentação do SDK e o grupo de usuários de programação Android sobre anexos de e-mail, mas não consigo encontrar nenhuma informação relacionada. No entanto, descobri que há outra constante de intent ACTION_SEND_MULTIPLE(disponível desde o nível 4 da API) que pode atender aos meus requisitos. Com base na documentação do SDK, ele simplesmente afirma que entrega vários dados a outra pessoa, como funciona ACTION_SEND, exceto que os dados são múltiplos. Mas ainda não consegui descobrir o uso correto para este comando. Tentei declarar a intenção com e ACTION_SEND_MULTIPLE, em seguida, liguei putExtra(EXTRA_STREAM, uri)várias vezes para anexar várias imagens, mas obtive o mesmo resultado incorreto de antes, nenhum anexo apareceu no e-mail.

Alguém tentou ACTION_SEND_MULTIPLEe conseguiu fazer com que funcionasse com vários anexos de e-mail?

aaaa1234
fonte
Eu tenho o mesmo problema. Não é um código de trabalho. O mesmo problema ocorre durante o envio de MMS, existe a possibilidade de adicionar apenas um arquivo. Você tem algumas idéias de outra maneira ??

Respostas:

187

Aqui está o código de que você precisa para criar um emailIntent que contenha vários anexos.

public static void email(Context context, String emailTo, String emailCC,
    String subject, String emailText, List<String> filePaths)
{
    //need to "send multiple" to get more than one attachment
    final Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
    emailIntent.setType("text/plain");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, 
        new String[]{emailTo});
    emailIntent.putExtra(android.content.Intent.EXTRA_CC, 
        new String[]{emailCC});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    emailIntent.putExtra(Intent.EXTRA_TEXT, emailText);
    //has to be an ArrayList
    ArrayList<Uri> uris = new ArrayList<Uri>();
    //convert from paths to Android friendly Parcelable Uri's
    for (String file : filePaths)
    {
        File fileIn = new File(file);
        Uri u = Uri.fromFile(fileIn);
        uris.add(u);
    }
    emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
    context.startActivity(Intent.createChooser(emailIntent, "Send mail..."));
}
Gregm
fonte
2
você se esqueceu de colocar o assunto e e-mailText para a intenção. caso contrário, obrigado pelo código.
Bahadır Yağan
5
O tipo de dados MIME correta deve ser "text / plain" e não "/ texto simples": emailIntent.setType("text/plain");. Se você usar "texto simples / simples", o Android forçará o uso do GMail como remetente, mas se você usar "texto simples", ele fornecerá uma caixa de diálogo de seleção de aplicativo com Gmail, Facebook, Bluetooth etc. Se você gostaria de propor apenas programas de e-mail use "text / xml" em vez disso.
Idolon
4
E se você alterar a última linha para context.startActivity(emailIntent);a caixa de seleção "Usar por padrão para esta ação" aparecerá na caixa de diálogo do seletor de aplicativos, assim o usuário poderá selecionar o aplicativo padrão para enviar os e-mails com vários anexos.
Idolon
2
Este exemplo está me rendendo uma "AndroidRuntimeException: chamar startActivity () de fora de um contexto de atividade requer o sinalizador FLAG_ACTIVITY_NEW_TASK. É realmente isso que você deseja?" Tentei passar o aplicativo e o contexto base para este método de e-mail e ambos resultaram no mesmo erro.
Ravemir
Isso resolveu para mim, mas não tenho certeza se estou escapando de um erro de uma forma estranha, então vou deixar o comentário anterior aqui para quem tiver alguma ideia a respeito.
Ravemir
29

ACTION_SEND_MULTIPLE deve ser a ação

e depois emailIntent.setType("text/plain");

Seguido por:

ArrayList<Uri> uris = new ArrayList<Uri>();
String[] filePaths = new String[] {"sdcard/sample.png", "sdcard/sample.png"};
for (String file : filePaths)
{
    File fileIn = new File(file);
    Uri u = Uri.fromFile(fileIn);
    uris.add(u);
}
emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
startActivity(emailIntent);

Isso funciona para mim.

santhana
fonte
19

Embora este seja um tópico antigo, mas como é mostrado no topo das pesquisas do google, quero adicionar uma pequena dica para torná-lo completo, portanto, eu tropecei nele.

É necessário tornar os arquivos anexados legíveis para a atividade de correio, caso contrário, eles não serão anexados. Então você tem que ligar para algum lugar

fileIn.setReadable(true, false)
Thomas
fonte
Obrigado senhor, o correio não conseguiu enviar os anexos apenas o correio.
Josejulio
Obrigada cara! Não consegui enviar as fotos sem esta linha
konunger
UAU! esta resposta salvou totalmente o meu dia. Se alguém obtiver o erro "um ou mais arquivos não anexados. Limit 20 MB" do aplicativo gmail, essa correção resolverá tudo. Melhor dica de todas!
belphegor
2

Para vários anexos, use PutParcelableArrayListExtra(Intent.ExtraStream, uris)onde a variável uris é um. List<IParcelable>(). Aqui está um exemplo:

var email = new Intent(Intent.ActionSendMultiple);
    email.SetType("text/plain");
    email.PutExtra(Intent.ExtraEmail, new string[]{emailTo});
    email.PutExtra(Intent.ExtraCc, new string[]{emailCC});

    var uris = new List<IParcelable>();
    filePaths.ForEach(file=> {
        var fileIn = new File(file);
        var uri = Android.Net.Uri.FromFile(fileIn);
        uris.Add(uri);
    });

    email.PutParcelableArrayListExtra(Intent.ExtraStream, uris);

    context.StartActivity(Intent.CreateChooser(email, "Send mail..."));

Espero que isto ajude ;)

Michele Caggiano
fonte