Up until Android Pie I always stored files which the app needed to get stored on /sdcard/my-app/
, which I got via
File fBaseDir = new File(Environment.getExternalStorageDirectory(), "my-app");
One of my App stores hundreds (up to multiple thousands) of favicons in /sdcard/my-app/favicons
, and when the user creates a backup of the app, it gets stored in /sdcard/my-app/backups
. Webpage-Screenshots taken by Google Chrome when shared with my app are stored in /sdcard/my-app/screenshots
, and so on.
When I uninstall the app, I can reinstall it later and still have all the favicons, screenshots and the backups available for restoring the state and not having to re-download all the favicons (and possibly having lost all the other data).
I can also easily create a backup of the /sdcard/my-app/
directory by copying it to my PC, and restore it on another phone, for example when I migrate to a new device.
I can also use a file explorer to see which files are in that directory, and select and email them or copy them to Google Drive, or delete some of them specifically (like old backup files).
With Android 10 this approach has collapsed. I cannot add the favicons to the Images Media-Folder, because they are no real images, they would clutter the view unnecessarily and possibly ban my developer account from the Play Store for doing this. I also don't want to store all this data in an App-Private directory, because it will get deleted when the app gets uninstalled, and because other apps like an explorer cannot access them.
What are my options? Manually selecting files or directories is not an option, unless the directory only needs to be selected once and then access is granted forever (to read and write files).
I never read or write outside of /sdcard/my-app/
.
android:requestLegacyExternalStorage
mode, though that’s temporary, second way would be using SAF, let the user select the root directory and grant your app the access, then you can pretty much handle copy, moving and other things usingDocumentFile
– Fontanaandroid:requestLegacyExternalStorage
will be useful during development. Is granting access with the SAF permament? – Gisarmeandroid:requestLegacyExternalStorage
will work on production too, untill the next major release. About the SAF permission being permanent, you can save theUri
that you get inonActivityResult()
and usegrantPermission()
andgetContentResolver().takePersistableUriPermission()
– Fontananext year
is (they don't care about timestamping their documentation). – Gisarmeandroid:requestLegacyExternalStorage
, but I know that I can't do this in the future. I will store the hundreds of favicons which require fast access in the App's private storage, while seldom-generated/accessed files like backup files and others will have to go through the storage framework. – Gisarme