Pergunta

Eu estou tentando lançar a intenção de enviar uma mensagem de e-mail. Tudo que funciona, mas quando eu tento realmente enviar o e-mail um par coisas 'estranho' acontecer.

aqui é o código

Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("image/jpeg");
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Photo");
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://sdcard/dcim/Camera/filename.jpg"));
sendIntent.putExtra(Intent.EXTRA_TEXT, "Enjoy the photo");
startActivity(Intent.createChooser(sendIntent, "Email:"));

Então, se eu lançar usando o menu de contexto Gmail Ela mostra o anexo, deixa-me escrever que o e-mail é, e editar o corpo e assunto. Nada demais. Eu bati send e envia. A única coisa é o anexo não é enviado.

Então. Eu pensei, por que não experimentá-lo w / o menu de contexto e-mail (para a minha conta de e-mail de backup no meu telefone). Ele mostra o anexo, mas nenhum texto de todo no corpo ou assunto. Quando eu enviá-lo, o anexo envia corretamente. Que me levam a crer que algo está muito errado. Preciso de uma nova permissão no lançamento de manifesto a intenção de enviar e-mail w / anexo? O que estou fazendo de errado?

Foi útil?

Solução

Também recebendo o mesmo problema

Código:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
    emailIntent.setType("image/jpeg");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] 
    {"me@gmail.com"}); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
    "Test Subject"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, 
    "go on read the emails"); 
    Log.v(getClass().getSimpleName(), "sPhotoUri=" + Uri.parse("file:/"+ sPhotoFileName));
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/"+ sPhotoFileName));
    startActivity(Intent.createChooser(emailIntent, "Send mail..."));

De adb logcat:

V/DumbDumpersMain( 3972):   sPhotoUri=file://sdcard/DumbDumpers/DumbDumper.jpg
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.CHOOSER comp={android/com.android.internal.app.ChooserActivity} (has extras) }
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x3000000 comp={com.google.android.gm/com.google.android.gm.ComposeActivityGmail} (has extras) }
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x2800000 comp={com.google.android.gm/com.google.android.gm.ComposeActivity} (has extras) }
D/gmail-ls(  120):      MailProvider.query: content://gmail-ls/labels/me@gmail.com(null, null)
D/Gmail   ( 2507):      URI FOUND:file://sdcard/DumbDumpers/DumbDumper.jpg

Parece que o provedor de e-mail está anexando um arquivo 0 comprimento. Quando eu verificar o sistema de arquivos o arquivo está lá e correta. O código que cria o arquivo de imagem é bem acabado antes da tentativa de enviá-lo.

Qualquer um fixo isso sem reboots mágicas (Eu já tentei isso)?

Saudações,
Fin

Atualizar

Caminho para mim deveria ter sido

file:///sdcard/DumbDumpers/DumbDumper.jpg

você precisa do / extra como isso aponta para o diretório raiz, i:.

file:// + /sdcard/DumbDumpers/DumbDumper.jpg

combinados como

file:///sdcard/DumbDumpers/DumbDumper.jpg

No exemplo acima trecho que você precisa:

emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+ sPhotoFileName));

Espero que isso ajude. Levou-me idades para depuração.

Saudações,
Finlay

Outras dicas

Apenas uma pequena observação do meu lado. Eu tenho tido os mesmos problemas com o Gmail, mas de alguma forma parece funcionar quando eu armazenar o arquivo em questão no cartão SD primeiro e recuperá-lo a partir daí, em vez da partir dos activos. Então, meu código é o seguinte:

Intent i = new Intent(Intent.ACTION_SEND);
i.putExtra(Intent.EXTRA_SUBJECT, "Title");
i.putExtra(Intent.EXTRA_TEXT, "Content");
i.putExtra(Intent.EXTRA_STREAM, uri);
i.setType("text/plain");
startActivity(Intent.createChooser(i, "Send mail"));

e aqui,

uri = Uri.fromFile(new File(context.getFilesDir(), FILENAME));

não trabalho, enquanto

uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), FILENAME));

faz.

Saudações, Michael

em vez de "URI.parse" utilização "Uri.fromFile (new File (Environment.getExternalStorageDirectory ()," nome do arquivo "))"

Environment.getExternalStorageDirectory () - caminho para SDcard ou qualquer outro tipo de armazenamento externo

Parece que este é realmente correto, não tenho certeza o que estava acontecendo, mas depois de uma reinicialização ele começou a trabalhar: /

    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("message/rfc822");
    i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"example@mail.com"});
    i.putExtra(Intent.EXTRA_SUBJECT, "Data from app");
    i.putExtra(Intent.EXTRA_TEXT   , "experience number x");
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "filename.txt"));
    i.putExtra(Intent.EXTRA_STREAM, uri);
    startActivity(Intent.createChooser(i, "Send email..."));

Eu tenho o mesmo problema e olhei em toda parte para uma solução. Finalmente, resolveu por encontrar um aplicativo de código aberto que trabalhou fora da caixa e olhou para como eles fizeram isso. O código é bastante longo por isso não vou citá-lo aqui, mas postar um link. Olhe para a função sendEmail na linha 449

http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/trunk/src/urbanstew/RehearsalAssistant/SessionPlayback.java?revision=94&view=markup

Eu reformulado meu código para ser semelhante, e agora ele funciona. Espero que isso vai ajudar outras pessoas na mesma situação.

A partir RFC 1738 secção 3.10:

A URL do arquivo assume a forma:

   file://<host>/<path>

que hospedeiro é o nome de domínio completo do sistema no que o caminho é acessível, e caminho é um hierárquica caminho do diretório do formulário diretório / diretório /.../ nome .

Por isso é file: /// path / de / root como http: // host / caminho / para / raiz porque há uma 'localhost' implícita entre a segunda ea terceira barra. Mas como mencionado acima, use Uri.FromFile () para construí-lo.

Eu tinha os mesmos sintomas. No meu caso, foi porque eu estava inicialmente salvar o anexo com o MODE_PRIVATE permissões. Assim que eu mudei para MODE_WORLD_READABLE parece GMail foi então capaz de acessar o arquivo e enviar o anexo corretamente.

Veja mais

É um trabalho perfeitamente para mim: Nesta solução as Nicolas criar uma cópia dentro da pasta de cache e aqui gmail intenção tem acesso! http://stephendnicholas.com/archives/974

public void sendMail(String path) {
        Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
        new String[] {AppConstant.server_mail});
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
        "IBPS ERROR Mail");
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,
        "This is an autogenerated mail from IBPS app");
        emailIntent.setType("image/png");
        Uri myUri = Uri.parse("file://" + path);
        emailIntent.putExtra(Intent.EXTRA_STREAM, myUri);
        startActivity(Intent.createChooser(emailIntent, "Send mail..."));
        }

Também tente adicionar Intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION); Isso ajudou com o meu problema.

Eu tenho a solução deste após 4 dias, Por favor, note os seguintes pontos, dando caminho para a classe File no Android (Java):

1) Uso caminho para String caminho de armazenamento interno = "/ armazenamento / sdcard0 / meuarquivo.txt";

2) caminho = "/ armazenamento / sdcard1 / meuarquivo.txt";

3) permissões menção no arquivo de manifesto.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

4) Primeira comprimento arquivo de verificação para confirmação.

5) Verifique caminhos no ES File Explorer sobre sdcard0 & sdcard1 é este mesmo, ou então ......

por exemplo.

File file=new File(path); 
long=file.length();//in Bytes

Envie um e-mail com um anexo: (por docs)

Intenção emailIntent = new Intent (Intent.ACTION_SEND); emailIntent.setType (HTTP.PLAIN_TEXT_TYPE);

emailIntent.putExtra (Intent.EXTRA_EMAIL, new String [] { "jon@example.com"});

emailIntent.putExtra (Intent.EXTRA_SUBJECT, "Email assunto"); emailIntent.putExtra (Intent.EXTRA_TEXT "texto da mensagem e-mail"); emailIntent.putExtra (Intent.EXTRA_STREAM, URI.parse ( "content: // path / to / e-mail / anexo"));

// Você pode também anexar vários itens passando um ArrayList de Uris

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top