Android getExternalStorageDirectory deprecated

У меня имеется класс файловый менеджер. Он работает нормально, но только до Android 9.0 включительно.

На Android 10.0 он возвращает пустой список.

Я думаю это из-за метода getExternalStorageDirectory(), который объявлен Deprecated в Android 10.0

Что можете посоветовать, без изменения существующей логики

class FileManager {

    constructor(context: Context) {
        val directory: File = if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState())
//            Environment.getExternalStorageDirectory()
        else ContextCompat.getDataDir(context) ?: throw Exception("File does not exist!")
        rootDirectory = directory
        navigateTo(directory)
    }

    lateinit var currentDirectory: File
    var rootDirectory: File

    fun navigateTo(directory: File): Boolean {
        /**
         * Проверяем является ли файл директорией
         */
        if (!directory.isDirectory) {
            Log.d("FileManager", "${directory.absolutePath} is not a directory!")
            return false
        }

        /**
         * Проверим, не поднялись ли мы выше rootDirectory
         */

        if ((directory != rootDirectory) && rootDirectory.absolutePath.contains(directory.absolutePath)) {
            Log.w(
                "FileManager",
                "Trying to navigate upper than root directory to " + directory.absolutePath
            );
            return false
        }

        currentDirectory = directory
        return true
    }
    fun isRootDirectory(): Boolean{
        if (currentDirectory == rootDirectory)
            return true
        return false
    }


    fun navigateUp(): Boolean {
        return navigateTo(currentDirectory.parentFile!!)
    }

    fun getFiles(): ArrayList<File> {
        val items = ArrayList<File>()
        val files = currentDirectory.listFiles()
        Log.d("files", files.size.toString())
        files?.let {
            items.addAll(currentDirectory.listFiles())
        }
        return items
    }

}

Я пробовал:

  1. context.filesDir - возвращает какие - то служебные файлы или библиотеки (например .Fabric, в котором находится crashlytics.sdk) - Не подходит
  2. context.obbDir - пусто
  3. context.cacheDir - как я понял cache моего приложения - Не подходит
  4. context.dataDir - это как я понял папка моего приложения - Не подходит
  5. context.externalCacheDir - пусто
  6. context.externalCacheDirs и context.externalMediaDirs не подходят так как возвращают список, а не один элемент

Есть еще варианты? И да, у меня минимальный API 18

Update

Нашел атрибут для application android:requestLegacyExternalStorage="true" но это костыль. Как сейчас по нормальному файловый проводник делать?


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

Автор решения: Eugene Krivenja

Как временная мера, чтобы найти новое решение и пересмотреть подход,
оставьте targetSdkVersion 28, до ноября 2020 года без проблем дотянуть :)

Android 10 (API level 29)
August 3, 2020: Required for new apps
November 2, 2020: Required for app updates

А вообще как раньше уже не будет. Это теперь называется Scoped Storage
https://developer.android.com/training/data-storage#scoped-storage

Т.е. доступ как раньше только к своим файлам.
Нужно что-то еще -- MediaStore API и Storage Access Framework в помощь.
По ссылке выше много информации по теме.

→ Ссылка