Android Присоединение файла к GMAIL - Не удается прикрепить пустой файл

У меня была программа, которая всегда прикрепляла бы тот же файл к GMAIL (Compose> Attach File> Open From> "MyProgram"). Он всегда выбирает один и тот же файл.

Что он делал:

String path = Environment.getExternalStorageDirectory() + "/file.3gp";
File f = new File(path);
Uri data = Uri.fromFile(f);
Intent i = new Intent();
i.setData(data);
setResult(Activity.RESULT_OK, i);
finish();

Это работало отлично до Android 6.0. Теперь, когда я пытаюсь его использовать, я получаю следующую ошибку:

Не удается подключить пустой файл

Astro File Sharing дает мне ту же ошибку (может быть старая сборка).

Тем не менее, я установил ES File Explorer, и когда я делаю ту же процедуру и выбираю файл, я получаю диалоговое окно, в котором говорится:

Поднимите файл как

  • Обычный способ Android (для MMS, Gmail,...)
  • File Way (попробуйте, если выше не удается)

"Путь к файлу" завершится неудачно, как моя программа. "Обычный способ Android" будет работать нормально.

Кто-нибудь имеет представление о том, что он делает, поэтому я могу реплицировать?

Заранее спасибо!

OBS: Уже много раз пыталась putExtra (STREAM, path), но безуспешно.

Ответ 1

Хорошо, теперь он работает, после многих исследований и перехвата некоторых намерений.

Мне нужно было изменить файл:///на content://.

Я сделал это, следуя этой информации с Android: https://developer.android.com/reference/android/support/v4/content/FileProvider.html

Единственное серьезное изменение заключалось в том, что я использовал жестко закодированный путь к /sdcard/file.ext. Кроме того, линия

getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);

был изменен на

Uri contentUri = FileProvider.getUriForFile(this, "com.mydomain.fileprovider", newFile);

Также необходимо было включить:

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
i.setData(contentUri);

Я не совсем понимаю, почему мне пришлось перейти от "Файл к контенту", но после этого файл теперь снова подключается! См. Ссылку, если вы столкнулись с этой проблемой, и не забывайте о новом.xml, который необходимо создать.

Ответ 2

См. Следующий вопрос:

андроид-6-не может -доля файлы-больше

Такое поведение наблюдается в Android 6.0 и Gmail. См. Следующий раздел.

Выпуск 3141 - андроид-разработчик-превью

Если вы перейдете в Settings-> Приложения → Gmail-> Разрешения и разрешите разрешение "Хранение" вручную, тогда общий ресурс будет работать.

Gmail должен запросить разрешение "Хранение" в этом сценарии, и он будет работать так же, как и во всех предыдущих версиях Android.

Другие приложения электронной почты должны правильно обрабатывать вложения.

Ответ 3

Вот как это исправить.

Перейдите в Настройки → Приложения → Gmail → Разрешения. Включите разрешение для "Хранение". Эта работа решила проблему для меня.

Ответ 4

Я не смог найти четкий ответ (отправка вложения на gmail без SD-карты). Я попытался скопировать другое имя файла, но не сигару. То, как я получил его на работу, это копирование в папку "Загрузка" и переход оттуда.

Получите путь для загрузок с помощью этого файла Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)

вытаскивает полный путь в папку downlaods, копируя attachemnt туда, и мы хороши. Файлы более 20M не идут