Questa domanda è stata postata prima, ma non c'era una risposta chiara o accettata e tutte le soluzioni fornite che dovevano "funzionare" non ha fatto per me Vedi qui: Gmail 5.0 app fails with "Permission denied for the attachment" when it receives ACTION_SEND intent"Autorizzazione negata per l'allegato" (su Gmail 5.0) che tenta di allegare un file all'intenzione dell'email
Ho un'app che crea i dati in un file di testo e deve inviare il file di testo in una e-mail, allegandolo automaticamente. Ho provato molti modi per ottenere questo da allegare, e apparentemente funziona per Gmail 4.9 e versioni precedenti, ma 5.0 ha alcune nuove funzioni di autorizzazione che impediscono di fare ciò che desidero.
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();
}
I datapieces potrebbero essere sì vuoti ma la linea di file corrente al di sotto del ciclo for è sempre affidabile e sempre attribuisce qualcosa.
Ho provato a cambiare
Uri.fromFile()
a
Uri.parse()
Quando lo faccio, annette, ma poi si blocca Gmail e quando si controlla il logcat è perché di un puntatore nullo. Ciò è probabilmente dovuto al fatto che Gmail non ha accesso al file e pertanto risulta nullo.
Ho anche provato con
getCacheDir()
anziché
getFilesDir()
ed ha lo stesso risultato.
Cosa sto facendo di sbagliato qui, e come dovrei andare a ripararlo? Qualche esempio di codice sarebbe davvero, davvero a portata di mano perché io sono nuovo nello sviluppo di Android e spiegando che cosa ho bisogno di fare senza una sorta di push off probabilmente non finirà per aiutare.
Grazie mille.
C'è una grande differenza tra la domanda e la soluzione: la domanda riguardava la condivisione dei file privati dell'app (da context.getFiles()), e nella risposta è diventata dalla memoria generale (~ context.getExternalFilesDir()) ... Non è la stessa cosa ... – Felix
Esiste una buona soluzione generale per i dispositivi che potrebbero non essere montati su storage esterno? O quello scenario è anche una preoccupazione ora? – dylansturg
L'utilizzo di una memoria esterna per archiviare l'allegato è diventato una cattiva pratica dall'API Android 23 e dal suo nuovo sistema di autorizzazioni. Se non chiedi all'utente l'autorizzazione WRITE_EXTERNAL_STORAGE al runtime, allora fallirà. –