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
}
}
Я пробовал:
- context.filesDir - возвращает какие - то служебные файлы или библиотеки (например .Fabric, в котором находится crashlytics.sdk) - Не подходит
- context.obbDir - пусто
- context.cacheDir - как я понял cache моего приложения - Не подходит
- context.dataDir - это как я понял папка моего приложения - Не подходит
- context.externalCacheDir - пусто
- context.externalCacheDirs и context.externalMediaDirs не подходят так как возвращают список, а не один элемент
Есть еще варианты? И да, у меня минимальный API 18
Update
Нашел атрибут для application android:requestLegacyExternalStorage="true" но это костыль.
Как сейчас по нормальному файловый проводник делать?
Ответы (1 шт):
Как временная мера, чтобы найти новое решение и пересмотреть подход,
оставьте 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 в помощь.
По ссылке выше много информации по теме.