2009-02-25 7 views
67

Ich versuche, eine Absicht zu starten, um eine E-Mail zu senden. All das funktioniert, aber wenn ich versuche, die E-Mail zu senden, passieren ein paar "komische" Dinge.Versucht, eine Datei von SD-Karte an E-Mail anzuhängen

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

Also, wenn ich das Gmail-Kontextmenü starten mit Sie den Anhang zeigt, lässt mich geben, die die E-Mail ist, und bearbeiten Sie den Körper & Thema. Keine große Sache. Ich drücke senden, und es sendet. Die einzige Sache ist die Anlage wird nicht gesendet.

So. Ich dachte mir, warum nicht versuchen Sie es mit dem E-Mail-Menü Kontext (für meine Backup-E-Mail-Konto auf meinem Handy). Es zeigt den Anhang, aber keinen Text im Körper oder Subjekt. Wenn ich es sende, sendet der Anhang korrekt. Das würde mich glauben machen, dass etwas nicht stimmt. Brauche ich eine neue Erlaubnis in der Manifest starten Sie eine Absicht, um E-Mail mit Anhang zu senden? Was mache ich falsch?

+1

Dank chrispix indem ein Arraylist von Uris mehrere Artikel anhängen können !, dieser Code arbeitete in meinem moto cliq. – Jana

Antwort

94

auch das gleiche Problem bekommen

Code:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
    emailIntent.setType("image/jpeg"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] 
    {"[email protected]"}); 
    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...")); 

Aus 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/[email protected](null, null) 
D/Gmail (2507):  URI FOUND:file://sdcard/DumbDumpers/DumbDumper.jpg 

Sieht aus wie der E-Mail-Anbieter Attachi ist ng einer Datei der Länge 0. Wenn ich das Dateisystem überprüfe, ist die Datei da und korrekt. Der Code, mit dem die Image-Datei erstellt wird, ist vor dem E-Mail-Versand fertig.

Jeder, der dies ohne Magie behoben wird, startet neu (das habe ich schon ausprobiert)?

Grüße,
Fin

aktualisieren

Weg für mich sollte

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

Sie wie diese Punkte in das Stammverzeichnis zusätzliche /, also müssen gewesen sein:

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

als

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

In den oben Schnipsel benötigen Sie:

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

Ich hoffe, das hilft. Ich habe lange gebraucht, um zu debuggen.

Grüße,
Finlay

+6

I upvoted, aber es wäre noch besser, wenn Sie dies überarbeitet, so dass die endgültige Lösung in den Code eingearbeitet wird. Die Lösung ist wichtiger als die Geschichte hier. –

+3

Ich änderte die Antwort, um die Tatsache zu reflektieren, dass es 3 Schrägstriche benötigt. Ich habe das auch gewählt. – Chrispix

+0

upvote, ich würde dies nicht nachbearbeiten, weil Leute eigentlich wissen sollten, wo der Fehler war. Danke für die Lösung. – mad

4

Es scheint, dass dies tatsächlich richtig ist, nicht sicher, was los war, aber nach einem Neustart es anfing zu arbeiten:/

+0

Der OP-Code hat einen Tippfehler: Der Pfad sollte 'file: /// sdcard' sein (beachten Sie die drei Schrägstriche, im Gegensatz zu zwei). –

7

statt "Uri.parse" Verwendung „Uri.fromFile (neue Datei (Umwelt.getExternalStorageDirectory(), „Dateiname“))“

Environment.getExternalStorageDirectory (.) - Pfad zu SDcard oder einem anderen externen Speicher

21

Nur eine kleine Bemerkung von meiner Seite Ich habe die gleichen Probleme wurden mit mit . GMail, aber irgendwie scheint es zu funktionieren, wenn ich die betreffende Datei auf der SD-Karte speichern erste und abrufen von dort, und nicht aus dem Vermögen Also mein Code ist 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)); 

tut nicht Arbeit, während

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

tut.

Grüße, Michael

+0

Ich fand das Gleiche. Ich frage mich, ob es ein Problem mit der Berechtigung ist, mit Gmail (oder einem anderen E-Mail-Programm) die Datei zu lesen? Eine Sache, die mir geholfen hat, ist, dass wenn ich das eingebaute "Mail" Programm (nicht Gmail) benutzte, es zeigte, dass der Anhang 0 Bytes war. Es war schön zu wissen, dass das Problem bestand, ohne meine E-Mail senden und überprüfen zu müssen. :-) –

+1

Ich würde vorschlagen, 'startActivity()' durch 'startActivityForResult()' zu ersetzen und die Datei aus dem Wurzelverzeichnis der SD-Karte in 'onActivityResult()' zu entfernen. –

+0

Ich denke, es ist kein Erlaubnissproblem. Es ist ein Problem mit Android, das irgendwo zwischen 2.3 und 4.2 korrigiert wurde. Wenn ich eine Datei auf internem Speicher lesbar mache, können andere Apps sie öffnen, aber Gmail kann sie nicht anhängen. Muss auf externen Speicher sein. Am 4.2 habe ich dieses Problem nicht. – Tom

3

habe ich das gleiche Problem und überall für eine Lösung gesucht. Schließlich löste ich es, indem ich eine Open-Source-App fand, die aus der Box funktionierte und sah, wie sie es gemacht hat. Der Code ist ziemlich lang, also werde ich ihn hier nicht zitieren, aber einen Link posten. Schauen Sie sich die Funktion in sendemail Linie 449

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

ich meinen Code Refactoring ähnlich zu sein, und jetzt funktioniert es. Ich hoffe, dass dies anderen in der gleichen Situation hilft.

3

Von RFC 1738 Abschnitt 3.10:

Eine Datei URL hat die Form:

file://<host>/<path> 

wo Host der Fully Qualified Domain Name des Systems, auf ist das der Weg zugänglich ist, und Pfad ist ein hierarchischer Verzeichnispfad der Form Verzeichnis/Verzeichnis /.../ Name.

Also ist es Datei: /// Pfad/von/root genau wie http://host/path/from/root weil es einen impliziten 'localhost' zwischen dem zweiten und dritten Schrägstrich gibt. Aber wie oben erwähnt, verwenden Sie Uri.FromFile(), um es zu erstellen.

+0

Der Teil über 3 Schrägstrich ist was ich will. Vielen Dank. –

0

Ich hatte die gleichen Symptome. In meinem Fall war es, weil ich den Anhang zuerst mit den Berechtigungen MODE_PRIVATE speicherte. Sobald ich es in MODE_WORLD_READABLE geändert habe, scheint es, dass GMail dann auf die Datei zugreifen und den Anhang ordnungsgemäß senden konnte.

See more

4
Intent i = new Intent(Intent.ACTION_SEND); 
    i.setType("message/rfc822"); 
    i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"}); 
    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...")); 
0
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...")); 
     } 
0

auch versuchen Intent.addFlags Zugabe (Intent.FLAG_GRANT_READ_URI_PERMISSION); Dies half mir bei meinem Problem.

0

ich auf diese Lösung erhalten haben nach 4 Tagen, beachten Sie bitte folgende Punkte, während Pfad geben Klasse Datei in Android (Java):

1) Verwenden Sie Pfad für interne Speicher String path = "/ storage/sdcard0/myfile.txt ";

2) path = "/ storage/sdcard1/myfile.txt";

3) Erwähnen Sie die Berechtigungen in der Manifest-Datei.

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

4) Überprüfen Sie zuerst die Dateilänge auf Bestätigung.

5) Überprüfen Sie Pfade in ES File Explorer in Bezug auf sdcard0 & sdcard1 das gleiche oder sonst ......

z.B.

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

eine E-Mail mit einem Anhang senden: (von docs)

Intent emailIntent = new Intent (Intent.ACTION_SEND); emailIntent.setType (HTTP.PLAIN_TEXT_TYPE);

emailIntent.putExtra (Intent.EXTRA_EMAIL, neuer String [] {"[email protected]"});

emailIntent.putExtra (Intent.EXTRA_SUBJECT, "E-Mail Betreff"); emailIntent.putExtra (Intent.EXTRA_TEXT, "E-Mail-Nachrichtentext"); emailIntent.putExtra (Intent.EXTRA_STREAM, Uri.parse ("Inhalt: // Pfad/zu/E-Mail/Anhang"));

// Sie auch

Verwandte Themen