Diese Frage wurde bereits zuvor gestellt, aber es gab keine klare oder akzeptierte Antwort und alle bereitgestellten Lösungen, die "funktionieren" sollten nicht für mich. Siehe hier: Gmail 5.0 app fails with "Permission denied for the attachment" when it receives ACTION_SEND intent"Zugriff verweigert für Anhang" (auf Google Mail 5.0) versucht, Datei an E-Mail-Absicht anzufügen
Ich habe eine App, die Daten in einer Textdatei aufbaut und die Textdatei in einer E-Mail senden muss, um sie automatisch anzuhängen. Ich habe viele Möglichkeiten ausprobiert, dies zu erreichen, und es funktioniert anscheinend für Gmail 4.9 und niedriger, aber 5.0 hat einige neue Berechtigungsfunktionen, die es davon abhalten, das zu tun, was ich mir wünsche.
Intent i = new Intent(Intent.ACTION_SEND);
String to = emailRecipient.getText().toString();
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
i.putExtra(Intent.EXTRA_SUBJECT, "Pebble Accelerometer Data");
i.putExtra(Intent.EXTRA_TEXT, "Attached are files containing accelerometer data captured by SmokeBeat Pebble app.");
String[] dataPieces = fileManager.getListOfData(getApplicationContext());
for(int i2 = 0; i2 < dataPieces.length; i2++){
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(getApplicationContext().getFilesDir() + File.separator + dataPieces[i2])));
}
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(getApplicationContext().getFilesDir() + File.separator + fileManager.getCurrentFileName(getApplicationContext()))));
Log.e("file loc", getApplicationContext().getFilesDir() + File.separator + fileManager.getCurrentFileName(getApplicationContext()));
try {
startActivity(Intent.createChooser(i, "Send Email"));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(Main.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
Die datapieces könnte leer ja sein, aber die aktuelle Datei Zeile unterhalb der for-Schleife ist immer zuverlässig und legt immer etwas.
Ich habe versucht,
Uri.fromFile()
zu
Uri.parse()
ändern, wenn ich das tue, es legt, aber Gmail dann abstürzt und wenn ich die logcat überprüfen ist es wegen eines Null-Zeiger. Dies liegt wahrscheinlich daran, dass Google Mail keinen Zugriff auf die Datei hat und daher als null gilt.
Ich habe auch
getCacheDir()
statt
getFilesDir()
mit versucht, und es hat das gleiche Ergebnis.
Was mache ich hier falsch, und wie soll ich es beheben? Ein Beispielcode wäre wirklich, wirklich handlich, weil ich neu in Android Entwicklung bin und erklären, was ich ohne irgendeine Art von Abdrücken tun muss, wird wahrscheinlich nicht am Ende helfen.
Vielen Dank.
Es gibt einen großen Unterschied zwischen der Frage und der Lösung - die Frage war, die privaten Dateien der Anwendung (aus context.getFiles()) zu teilen, und in der Antwort wurde es aus dem allgemeinen Speicher (~ context.getExternalFilesDir()) ... nicht das gleiche ... – Felix
Gibt es eine gute allgemeine Lösung für Geräte, auf denen möglicherweise kein externer Speicher installiert ist? Oder ist dieses Szenario jetzt sogar ein Problem? – dylansturg
Das Verwenden von externem Speicher zum Speichern des Anhangs ist seit Android API 23 und seinem neuen Berechtigungssystem zu einer schlechten Übung geworden. Wenn Sie den Benutzer zur Laufzeit nicht nach der Berechtigung WRITE_EXTERNAL_STORAGE fragen, schlägt er fehl. –