R Raw Paths and All Files Access
In R DP1, I could not get the “raw paths” feature or the “all files access” feature to work.
In R DP2, both seem to be working fine.
The documentation is a bit confusing, but here is what I have seen in light experimentation.
Raw Paths
UPDATE 2020-05-16: The material in this section is out of date. Please see this updated post for updated information.
In a nutshell, READ_EXTERNAL_STORAGE
works like it did from Android 4.4 through
Android 9. If you request it, and the user grants it, you can traverse external
storage more or less as you were used to.
However, there are caveats:
-
The documentation mentions reduced performance. I have not attempted to do any sort of apples-to-apples comparison, but I don’t get the sense that the performance degradation is severe.
-
As the documentation notes, you still do not have access to
Android/
and its subdirectories. -
I have not tried removable storage.
-
While the documentation emphasizes native libraries, read access works fine from Java/Kotlin. I have not tried native library access, but I assume that it works.
Also, methods like getExternalStorageDirectory()
and getExternalStoragePublicDirectory()
on Environment
are still deprecated. My guess is that we are supposed to use
getDirectory()
on StorageVolume
, as that was added in Android R. I have
not experimented with that yet. getExternalStorageDirectory()
works, at least
on R DP2, returning the conventional location.
All Files Access
Simply put, MANAGE_EXTERNAL_STORAGE
is the new WRITE_EXTERNAL_STORAGE
.
If you request MANAGE_EXTERNAL_STORAGE
in the manifest,
and you use Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION
to bring up the Settings screen for this, and the user grants the permission, then
you can write content to external storage. The effect is akin to what we had
from Android 4.4 through Android 9.
Again, though, there are caveats:
-
The same concerns exist around how we get the filesystem path to use.
-
Presumably, write performance is also reduced.
-
Even with this permission, you still do not have access to
Android/
and its subdirectories. -
I still have not tried removable storage (hey, I’ve been busy writing this blog post).
-
There is no obvious means to find out if we hold this permission. It is not a
dangerous
permission, socheckSelfPermission()
does not work. The issue has been marked as “fixed”, but I did not notice a method for this in DP2, so perhaps the method will show up in a later developer preview.
Now What?
Given last year’s continuous changes in this area in the Q developer previews, I am not making any final recommendations until R ships as Android 11.
Also, the fact that filesystem-style access is back in R does not change the fact that
we should be losing that access in Q. android:requestLegacyExternalStorage
is supposed to be ignored by Android 10 once our targetSdkVersion
hits 29.
Assuming that remains the case (I have not re-tested it), then we still lack
filesystem-style access in Android 10, even though we have it in 9 and 11.
If so, you are still going to be needing to try to adopt the Storage
Access Framework and/or the MediaStore
to handle Android 10. Plus, the
MANAGE_EXTERNAL_STORAGE
permission screen is decidedly more scary-looking
than the normal dangerous
permission dialog, so fewer users will be willing
to grant it.
So, I’ll be watching this area in DP3 and beyond, to see what changes, if anything. However, it looks like external storage is making a comeback, after I left it for dead almost exactly one year ago.