#android #android-storage
#Android #android-хранилище
Вопрос:
Наиболее интуитивно понятным кажется Environment.getStorageDirectory()
. Однако в Android Studio он красный с предупреждением о том, что для вызова требуется уровень Api R (минимум 16). Я, конечно, не собираюсь повышать минимальный Api до 30 (= R)! Тем не менее, мое приложение запускается в эмуляторе с Android 7.1.1, и я могу перечислить содержимое этого каталога. Как это возможно?
Тогда есть Environment.getExternalStorageDirectory()
, который устарел. Я бы все равно использовал его, хотя, если это все еще рекомендуемый подход в 2021 году. Однако я не понял, как получить доступ к внешней SD-карте или USB-накопителю с помощью этого метода. Несмотря на свое название, кажется, что оно предоставляет доступ только к внутренней эмулируемой SD-карте.
Я также нашел File.listRoots()
, который возвращает "/"
. Но File.listRoots()[0]
или File("/")
оба null
. Чего мне здесь не хватает? Почему я не могу получить доступ к файловой системе таким образом?
В and есть несколько других методов Environment
Context
, но, насколько я могу судить, они предоставляют доступ только к некоторому специальному каталогу. Я хочу получить доступ ко всей файловой системе и ко всем блочным устройствам, как в приложении File Explorer.
Комментарии:
1. «Я хочу получить доступ ко всей файловой системе и ко всем блочным устройствам, как в приложении проводника файлов» — за пределами корневых устройств нет приложения проводника файлов, которое имело бы доступ ко всей файловой системе. «Почему я не могу получить доступ к файловой системе таким образом?» — потому что у вас нет разрешения на доступ
/
. «Я не понял, как получить доступ к внешней SD-карте или USB-накопителю с помощью этого метода» — на самом деле это не вариант в большинстве версий Android.2. «кажется, что он предоставляет доступ только к внутренней эмулируемой SD-карте» — он предоставляет доступ к внешнему хранилищу . «Тем не менее, мое приложение запускается в эмуляторе с Android 7.1.1, и я могу перечислить содержимое этого каталога. Как это возможно?» — Я думаю, что эта функция существует уже давно, просто, возможно, не представлена в Android SDK. Возможно, вы захотите просмотреть документацию по хранению данных или предпочитаемую вами книгу по разработке приложений для Android.
3. И, если вы действительно хотите попробовать реализовать проводник файлов, существует множество программ с открытым исходным кодом, которые вы можете использовать в качестве основы, например, this и this .
4. Посмотрите на все элементы, возвращаемые getExternalFilesDirs() . Это даст вам пути к внешнему хранилищу, съемной карте Micro sd и часто USB otg-накопителям. Если последнее не указано, используйте платформу доступа к хранилищу для доступа к нему. SAF можно использовать и для всех трех.
5. @CommonsWare: спасибо за ссылку на ваш блог, эта статья (и другие из серии) были очень информативными. Ситуация намного хуже, чем я думал!