Этот вопрос был опубликован раньше, но не было четкого или принятого ответа и всех решений, которые должны были «работать», не для меня. См. Здесь: Gmail 5.0 app fails with "Permission denied for the attachment" when it receives ACTION_SEND intent«Разрешение отклонено для вложения» (в Gmail 5.0), пытающегося прикрепить файл к намерению электронной почты
У меня есть приложение, которое создает данные в текстовом файле и должно отправлять текстовый файл по электронной почте, автоматически прикрепляя его. Я пробовал много способов подключить это приложение, и, по-видимому, он работает для Gmail 4.9 и ниже, но 5.0 имеет некоторые новые функции разрешения, отключающие его от выполнения того, что я хочу.
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();
}
В datapieces может быть пустым, да, но текущая строка файла ниже цикл всегда надежен и всегда придает то.
Я попытался изменить
Uri.fromFile()
в
Uri.parse()
Когда я делаю это, он придает, но Gmail затем падает, и когда я проверяю LogCat это из-за нулевого указателя. Скорее всего, это связано с тем, что Gmail не имеет доступа к файлу и поэтому имеет значение null.
Я также попытался с помощью
getCacheDir()
вместо
getFilesDir()
и имеет тот же результат.
Что я здесь делаю неправильно, и как мне его исправить? Некоторый пример кода был бы действительно, действительно удобно, потому что я новичок в разработке Android и объясняю, что мне нужно делать без какого-то отталкивания, вероятно, не поможет.
Большое спасибо.
Существует огромная разница между вопросом и решением - вопрос заключается в совместном использовании личных файлов приложения (из context.getFiles()), и в ответ он стал из общего хранилища (~ context.getExternalFilesDir()) ... Не то же самое ... – Felix
Есть ли хорошее общее решение для устройств, которые не могут иметь внешнее хранилище? Или это сценарий, даже беспокойство сейчас? – dylansturg
Использование внешнего хранилища для хранения вложения стало плохой практикой с Android API 23 и его новой системой разрешений. Если вы не запрашиваете у пользователя разрешения WRITE_EXTERNAL_STORAGE во время выполнения, он не будет работать. –