UPDATE, to clarify the doubts and confusions shown by some developers in the comments:
- If using the requestLegacyExternalStorage flag in Android 10 (
API 29) then
request the WRITE_EXTERNAL_STORAGE permission as usual.
-
The flag requestLegacyExternalStorage does nothing in Android 11 (API 30), it is completely ignored,
and there is not workaround for it.
- WRITE_EXTERNAL_STORAGE does not give any privileges in Android 11 (
API 30), it does nothing at all,
therefore in
API 11 you need to set the maxSdkVersion to 29.
- If in Android 10 (
API 29) you are also not using requestLegacyExternalStorage then set maxSdkVersion to 28
instead of 29.
- Starting in Android 11 (
API 30), the older File
API can again be used but "only" when accessing the public "shared
storage" folders (DCIM, Music, etc.), or your app "private" directory.
For other locations the DocumentFile
API is required.
- Consider that the File
API is now much slower in Android 11 (
API 30), because has been refactored becoming
essentially a wrapper. This is to enforce its usage just to the allowed locations. So, is no longer a fast system file
API, is just a wrapper that internally delegates the work to the MediaStore. When using the File
API in Android 11
or above you should consider the performance penalty hit, as according to the Android team it will be 2 to 3 times
slower than if accessing directly the MediaStore.