69 Stimmen

Ich versuche, eine Datei von der SD-Karte an eine E-Mail anzuhängen

Ich versuche, eine Absicht zu starten, um eine E-Mail zu senden. All das funktioniert, aber wenn ich versuche, die E-Mail tatsächlich zu senden, passieren ein paar "seltsame" Dinge.

Hier ist der Code

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:"));

Wenn ich also das Google Mail-Menü im Kontext aufrufe, wird der Anhang angezeigt, ich kann eingeben, an wen die E-Mail gerichtet ist, und den Text und den Betreff bearbeiten. Keine große Sache. Ich drücke auf Senden, und die E-Mail wird gesendet. Das Problem ist nur, dass der Anhang NICHT gesendet wird.

Also dachte ich mir, warum nicht mit dem Kontext des E-Mail-Menüs versuchen (für mein Backup-E-Mail-Konto auf meinem Telefon). Es wird der Anhang angezeigt, aber kein Text im Textkörper oder im Betreff. Wenn ich sie versende, wird der Anhang korrekt gesendet. Das lässt mich vermuten, dass hier etwas nicht stimmt. Benötige ich eine neue Berechtigung im Manifest, um eine E-Mail mit Anhang zu versenden? Was mache ich falsch?

96voto

Finlay Punkte 161

Das gleiche Problem tritt auch auf

Code:

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..."));

Von 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

Es sieht so aus, als ob der E-Mail-Anbieter eine Datei der Länge 0 anhängt. Wenn ich das Dateisystem überprüfe, ist die Datei vorhanden und korrekt. Der Code, mit dem die Bilddatei erstellt wird, ist vor dem Versuch, sie per E-Mail zu versenden, bereits fertig.

Hat jemand dieses Problem ohne magische Neustarts behoben (das habe ich bereits versucht)?

Herzliche Grüße,
Flosse

Update

Der Weg für mich hätte lauten müssen

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

Sie brauchen das Extra / da dieser auf das Root-Verzeichnis zeigt, d.h.:

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

kombiniert als

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

In dem obigen Schnipsel benötigen Sie:

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

Ich hoffe, das hilft. Ich habe ewig für die Fehlersuche gebraucht.

Herzliche Grüße,
Finlay

21voto

Michael F Punkte 333

Nur eine kleine Bemerkung von meiner Seite. Ich habe die gleichen Probleme mit GMail, aber irgendwie scheint es zu funktionieren, wenn ich die betreffende Datei zuerst auf der SD-Karte speichere und sie von dort abrufe, anstatt von den Assets. Mein Code ist also der folgende:

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"));

und hier,

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

fait no Arbeit, während

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

tut.

Herzliche Grüße, Michael

7voto

Snigdha Punkte 103

Anstelle von "Uri.parse" verwenden Sie "Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "file name"))"

Environment.getExternalStorageDirectory() - Pfad zur SD-Karte oder einem anderen externen Speicher

4voto

Eduardo Matos Punkte 71
    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..."));

4voto

Chrispix Punkte 17291

Es scheint, dass dies tatsächlich korrekt ist, nicht sicher, was passiert war, aber nach einem Neustart begann es zu funktionieren :/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X