Собственный почтовый клиент Android не извлекает файлы из папки Environment.getExternalStorageDirectory(). GetPath()
У меня есть приложение для Android, для которого у меня есть возможность отправлять логи по электронной почте
Для этого я использую следующую процедуру
String outputPath=Environment.getExternalStorageDirectory().getPath()+ File.separator+"sundeeplogs"+ File.separator;
File dir = new File (outputPath);
if (!dir.exists())
{
dir.mkdirs();
}
File zipFileSDCard = new File(outputPath+"sundeep_logs.zip");
Теперь я бы скопировал zip, который находится в безопасном месте, на zipFileSDCard .
Я проверил, что файл был успешно скопирован
добавление zip-файла к цели
targetedShare.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(zipFileSDCard));
Когда я отправляю электронное письмо с помощью приложения Gmail, электронное письмо отправляется с вложениями, и я могу просмотреть вложение в полученном письме.
проблема:
когда я использую собственный почтовый клиент Android, он иногда не прикрепляет файл, даже если он прикреплен и электронное письмо отправлено, в полученном письме нет вложений.
Наконец я нашел проблему, почему вложение отсутствует, но не смог найти причину, по которой собственный клиент отбрасывает вложение. Проблема, описанная в этой ссылке. Загруженное вложение не помечено как ошибка загрузки в Android.
2 ответа
Какую версию ОС вы используете? на старых устройствах я обнаружил, что это просто не работает с клиентским приложением Gmail.
Похоже, что GMail гораздо мягче, чем какое-либо родное почтовое приложение в отношении вложений.
После долгих анализов, проб и ошибок я обнаружил, что следующее намерение будет работать как с GMail, так и с родным почтовым приложением на Samsung Galaxy S5 (никаких гарантий для других устройств)
public static void emailFile(Activity context, File attachmentInCacheDir, String to, String subject, String body) {
Intent intent = new Intent(Intent.ACTION_SEND);//SENDTO does not seem to work for native
intent.setData(Uri.fromParts("mailto",to, null));
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, body);
intent.setType("message/email");
if (attachmentInCacheDir != null) {
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + CachedFileProvider.getAuthority(context) + "/" + attachmentInCacheDir.getName()));
}
context.startActivityForResult(Intent.createChooser(intent, "Send Email"), 1000);
}
Как видите, я использую провайдера в качестве Uri, поэтому мне не нужно выставлять данные путем копирования в общедоступный каталог. Я не уверен, является ли это другим требованием для работы всех родных почтовых приложений. При реализации провайдера мне нужно было реализовать метод 'query', чтобы вернуть размер файла вложения, иначе нативное приложение отклонит его.