Ответ 1
TL: DR <external-path name="MyAppFolder" path="." />
работает, но безопасно?
Вам нужно будет сделать свой собственный FileProvider
. Стоит прочитать документацию , но здесь краткое изложение.
Как упоминалось в @CommonsWare, вам нужно заменить MediaStore.AUTHORITY
из вашего примера на "com.example.fileprovider"
, который является полномочием, который вы определите в своем манифесте, например...
В теге <application>
в AndroidManifest введите следующее:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
Исключение, которое вы получаете, связано с тем, что тег <meta-data>
, связанный с XML файлом, со всеми путями, доступными для вашего FileProvider
. Но это то, что происходит в этом файле, с которым я боролся сам.
В конце учебника, с которым вы связались, в конце Сохранить полноразмерную фотографию, пример Google дает это file_paths.xml
:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Android/data/com.example.package.name/files/Pictures" />
</paths>
"my_images"
будет заменен на "MyAppFolder"
в вашем примере. В этом учебнике Google утверждает, что
Компонент пути соответствует пути, возвращаемому getExternalFilesDir() при вызове с помощью среды .DIRECTORY_PICTURES. Убедитесь, что вы заменили com.example.package.name фактическим именем пакета вашего приложения.
... и набрав это, я понял, что это НЕ относится к каталогу Public Pictures, который вы и я ищем. Это объясняет, почему использование этого пути создает это исключение:
java.lang.IllegalArgumentException: Не удалось найти настроенный root, который содержит /storage/emulated/ 0/Pictures/MyAppFolder/{filename}.jpg
Я оставлю это здесь для дальнейшего использования и перейду к ответу на ваш большой вопрос - какой путь вы можете указать, чтобы другие приложения могли взаимодействовать с файлом в общедоступном каталоге "Картинки", созданном на уровне API приложения с таргетингом на приложения 24 +?
Как сообщает @CommonsWare, "детали вашего желаемого подкаталога меняются по устройству", поэтому вы не можете объявить путь к общедоступному каталогу Pictures, но я нашел способ, который работает.
<external-path name="MyAppFolder" path="." />
позволит вашему FileProvider
предоставлять URI контента другим приложениям (например, Camera), которые затем могут читать и записывать в файл, который он разрешает.
Если есть какие-то опасности или недостатки, я хотел бы услышать их.