Не удается найти файлы в памяти телефона реального устройства в android 10 - PullRequest
1 голос
/ 21 июня 2020

Я использую телефон Samsung A30s для доступа к файлам памяти телефона. Расположение моих файлов на устройстве: / storage / emulated / 0 / MY_FILES /. Я сохранил некоторые файлы в каталоге MY_FIlES, но в приведенном ниже коде не отображаются файлы, содержащиеся в этом каталоге.

Итак, как я могу получить все файлы, принадлежащие этому каталогу MY_FIlES в хранилище телефона?

File Directory = new File("/storage/emulated/0/MY_FIlES/");
File[] files = Directory.listFiles();

Но файлы возвращают значение null;

Примечание. У меня есть разрешение (READ_EXTERNAL_STORAGE) на доступ к файлу.

Одна важная вещь: я обновил свой телефон до последней версии API. Но до обновления я использовал этот путь, "/ sdcard / MY_FIlES /, и он работал нормально.

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Во-первых, никогда не указывайте пути для приложений, которые вы планируете распространять. Для них используйте методы Context, Environment или StorageVolume (только Android 11), чтобы найти базовый каталог для использования.

Для Android 10 и 11 вам нужно чтобы добавить android:requestLegacyExternalStorage="true" к вашему элементу <application> в манифесте. Это позволяет выбрать устаревшую модель хранилища, и ваш существующий код внешнего хранилища будет работать.

Обратите внимание, что в Android 11+ вы не сможете писать в этот каталог, независимо от того, запросили ли вы WRITE_EXTERNAL_STORAGE или нет. Google очень предпочел бы, чтобы вы использовали платформу доступа к хранилищу (например, ACTION_OPEN_DOCUMENT), чтобы пользователи имели больший контроль над местом размещения файлов на их устройствах или в выбранных ими поставщиках облачных хранилищ.

1 голос
/ 21 июня 2020

Я хотел бы добавить еще кое-что к ответу @CommonsWare. Согласно обновлению хранилища Android, они применяют scoped storage в версии Android 11.

Но чтобы дать разработчикам дополнительное время для тестирования, приложения, нацеленные на Android 10 (уровень API 29) все еще может запросить атрибут requestLegacyExternalStorage. Этот флаг позволяет приложениям временно отказаться от изменений, связанных с ограниченным хранилищем, таких как предоставление доступа к различным каталогам и различным типам мультимедийных файлов. После обновления приложения до целевого Android 11, система игнорирует флаг requestLegacyExternalStorage.

Если ваше приложение не использует ограниченное хранилище при работе на Android 10 устройствах, рекомендуется продолжить установку requestLegacyExternalStorage в значение true в файле манифеста вашего приложения. Таким образом, ваше приложение может продолжать вести себя должным образом на устройствах, на которых выполняется Android 10.

Для получения дополнительной информации, пожалуйста, проверьте документацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...