ACTION_SEND – общий доступ к файлу с другим именем файла, чем на диске

Краткая версия вопроса ..

Можно ли запустить намерение ACTION_SEND для совместного использования файла на диске, но иметь другое имя файла, используемое общим ресурсом, чем имя файла на диске?

Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("image/png"); shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile("somepath/3c72ae1adacb.dat")); // BEGIN Hopefully something like this exists.... shareIntent.putExtra(Intent.EXTRA_FILENAME, "CuteKittens.png")); // END startActivity(shareIntent); 

Длинная версия …

По соображениям безопасности некоторые файлы, используемые в моем приложении для Android, закрыли имена файлов на диске, такие как «3c72ae1adacb.dat».

Я хотел бы, чтобы зарегистрированные пользователи могли публиковать эти файлы, но с их не скрытым именем файла, таким как «CuteKittens.png».

Возможно ли это? (В идеале без копирования файла на диске, обмена копией и, наконец, удаления его, что кажется очень много работы для чего-то так прямолинейно).

Вы не должны использовать file:// значения Uri в целом, так как нет гарантии, что другие приложения смогут читать эти файлы.

Вы можете использовать ContentProvider который обслуживает эти файлы, где ваши значения Uri имеют «un-obscured filename». Так, а не:

 shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile("somepath/3c72ae1adacb.dat")); 

вам придется:

 shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://your.authority.goes.here/files/CuteKittens.png")); 

И ContentProvider знал бы тем или иным способом, что контент для CuteKittens.png находится в somepath/3c72ae1adacb.dat .

Встроенный FileProvider – это то, что вам нужно, за исключением того, что я предполагаю, что имена файлов (как оригинальные, так и переименованные) неизвестны во время компиляции.