#167 improved volume fetch for Android 11+

This commit is contained in:
Thibault Deckers 2022-03-08 18:46:26 +09:00
parent 9e1d141111
commit cc1ca9f950

View file

@ -115,6 +115,15 @@ object StorageUtils {
} }
private fun findPrimaryVolumePath(context: Context): String? { private fun findPrimaryVolumePath(context: Context): String? {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val sm = context.getSystemService(Context.STORAGE_SERVICE) as? StorageManager
val path = sm?.primaryStorageVolume?.directory?.path
if (path != null) {
return ensureTrailingSeparator(path)
}
}
// fallback
try { try {
// we want: // we want:
// /storage/emulated/0/ // /storage/emulated/0/
@ -130,9 +139,16 @@ object StorageUtils {
} }
private fun findVolumePaths(context: Context): Array<String> { private fun findVolumePaths(context: Context): Array<String> {
// Final set of paths if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val paths = HashSet<String>() val sm = context.getSystemService(Context.STORAGE_SERVICE) as? StorageManager
val paths = sm?.storageVolumes?.mapNotNull { it.directory?.path }
if (paths != null) {
return paths.map(::ensureTrailingSeparator).toTypedArray()
}
}
// fallback
val paths = HashSet<String>()
try { try {
// Primary emulated SD-CARD // Primary emulated SD-CARD
val rawEmulatedStorageTarget = System.getenv("EMULATED_STORAGE_TARGET") ?: "" val rawEmulatedStorageTarget = System.getenv("EMULATED_STORAGE_TARGET") ?: ""
@ -143,7 +159,8 @@ object StorageUtils {
var validFiles: Boolean var validFiles: Boolean
do { do {
// `getExternalFilesDirs` sometimes include `null` when called right after getting read access // `getExternalFilesDirs` sometimes include `null` when called right after getting read access
// (e.g. on API 30 emulator) so we retry until the file system is ready // (e.g. on API 30 emulator) so we retry until the file system is ready.
// TODO TLAD It can also include `null` when there is a faulty SD card.
val externalFilesDirs = context.getExternalFilesDirs(null) val externalFilesDirs = context.getExternalFilesDirs(null)
validFiles = !externalFilesDirs.contains(null) validFiles = !externalFilesDirs.contains(null)
if (validFiles) { if (validFiles) {