Android, Как сохранить файл во внутреннюю память, не в кэш или папки приложения?

Kotlin. В приложении надо добавить вариант сохранить данные в файл, для того чтобы их куда хочет пользователь перекидывать или открывать в других приложениях. Соответственно в context?.getExternalFilesDir("Data") и подобные файл сохраняется прекрасно, но во-первых это не очевидные папки для пользователя во вторых эти папки не доступны для других приложений, да и после удаления приложения эти папки тоже удаляются. Но при попытке сохранить куда-то во внутренне хранилище получаю ошибку "open failed: EACCES (Permission denied)"

android:requestLegacyExternalStorage="true"
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Не дают никакого эффекта


Ответы (1 шт):

Автор решения: user12917759

Можно воспользоваться MediaStore API.

Написал примерно такой код и он работает:

val values = ContentValues()
values.put(MediaStore.MediaColumns.DISPLAY_NAME, "savedFromCalorieTrackKLite") //file name
values.put(MediaStore.MediaColumns.MIME_TYPE, "text/plain") //file extension, will automatically add to file
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOCUMENTS + "/CalorieTrackKLite/") //end "/" is not mandatory
val uri = getActivity()?.getContentResolver()?.insert(MediaStore.Files.getContentUri("external"), values) //important!
val outputStream = getActivity()?.getContentResolver()?.openOutputStream(uri!!)
outputStream?.write(toFile.toString().toByteArray())
outputStream?.close()
→ Ссылка