Собственный почтовый клиент 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', чтобы вернуть размер файла вложения, иначе нативное приложение отклонит его.

Другие вопросы по тегам