Tentando anexar um arquivo a partir do cartão SD para e-mail
-
06-09-2019 - |
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?
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
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.
É 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