wake-up-neo.com

Versuch, 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 versenden, passieren ein paar "seltsame" Dinge.

hier ist 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 über den Google Mail-Menü-Kontext starte, wird der Anhang angezeigt. Dann kann ich den Namen der E-Mail eingeben und den Text und den Betreff bearbeiten. Keine große Sache. Ich klicke auf senden und es sendet. Die einzige Sache ist, dass der Anhang NICHT gesendet wird.

So. Ich dachte mir, warum sollte ich es nicht mit dem E-Mail-Menü-Kontext versuchen (für mein Backup-E-Mail-Konto auf meinem Telefon). Es zeigt den Anhang, aber keinen Text im Hauptteil oder Betreff. Wenn ich es sende, wird der Anhang korrekt gesendet. Das würde mich dazu bringen zu glauben, dass etwas völlig falsch ist. Benötige ich eine neue Erlaubnis, um im Manifest eine E-Mail mit Anhang zu starten? Was mache ich falsch?

69
Chrispix

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

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

Sieht aus, als hänge der E-Mail-Anbieter eine Datei mit der Länge 0 an. 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, gut abgeschlossen. 

Hat das jemand ohne magische Neustarts behoben (habe ich schon probiert)?

Grüße,
Flosse

Update

Weg für mich hätte sein sollen

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

sie benötigen den zusätzlichen /, da dieser auf das Stammverzeichnis verweist, d. h .:

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

kombiniert als

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

Im obigen Ausschnitt 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

95
Finlay

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

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

funktioniert nicht, wohingegen

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

tut.

Viele Grüße Michael

21
Michael F

verwenden Sie anstelle von "Uri.parse" "Uri.fromFile (neue Datei (Environment.getExternalStorageDirectory ()," Dateiname "))"

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

7
Snigdha

Es scheint, dass dies tatsächlich richtig ist, nicht sicher, was passiert ist, aber nach einem Neustart funktionierte es: /

4
Chrispix
    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..."));
4
Eduardo Matos

Von RFC 1738 Abschnitt 3.10:

Eine Datei-URL hat die Form:

   file://<Host>/<path>

dabei ist Host der vollständig qualifizierte Domänenname des Systems auf Auf den Pfad kann zugegriffen werden, und path ist hierarchisch Verzeichnispfad des Formulars Verzeichnis/Verzeichnis /.../ Name.

Es ist also file: /// path/from/root genauso wie http: // Host/path/from/root , da zwischen dem zweiten und dritten Schrägstrich ein impliziter 'localhost' steht. Verwenden Sie jedoch wie oben erwähnt Uri.FromFile (), um es zu erstellen.

3
android.weasel

Ich hatte das gleiche Problem und suchte überall nach einer Lösung. Schließlich löste ich es, indem ich eine Open-Source-App fand, die von Anfang an funktionierte. Der Code ist ziemlich lang, deshalb werde ich ihn hier nicht zitieren, sondern einen Link posten. Schauen Sie sich die sendEmail-Funktion in Zeile 449 an

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

Ich habe meinen Code in einen ähnlichen Code umgewandelt, und jetzt funktioniert er. Ich hoffe, dass dies anderen in derselben Situation helfen wird.

3
Railsdev

Ich habe nach 4 Tagen eine Lösung gefunden. Bitte beachten Sie die folgenden Punkte, während Sie den Pfad zur Dateiklasse in Android (Java) angeben:

1) Pfad für internen Speicher verwenden String path = "/ storage/sdcard0/myfile.txt"; 

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

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

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

4) Zuerst die Dateilänge zur Bestätigung prüfen. 

5) Überprüfen Sie die Pfade im ES File Explorer bezüglich sdcard0 und sdcard1.

z.B.

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

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

Mehr sehen

0
CasualCoder
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
Jotiram Chavan

Senden Sie eine E-Mail mit einem Anhang: (Nach Dokumenten)

Absicht 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 ("content: // pfad/an/email/anhang")); 

// Sie können auch mehrere Elemente anhängen, indem Sie eine ArrayList von Uris übergeben

0
shaiban

Es funktioniert perfekt für mich: Bei dieser Lösung erstellt der Nicolas eine Kopie im Cache-Ordner. Hier hat gmail intent Zugriff! http://stephendnicholas.com/archives/974

0
lucasddaniel

Versuchen Sie auch, Intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION) hinzuzufügen. Das hat bei meinem Problem geholfen. 

0
James Jones