Доступ к внутренней памяти

Вопрос наверное уже давно заезженный...
Но ни как не могу разобраться, как сохранять и загружать файлы из внутренней памяти телефона. Именно та память, где находятся папки: Android, DCIM, Download, Movies, Music и т.д., а не внутреннее хранилище (память для приложения) или внешняя память (СД карта)

В манифест добавил:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

с помощью

Environment.getExternalStorageDirectory().getAbsolutePath();

мне удалось получить "/storage/emulated/0". Что это такое? Почему на ВМ (Nexus 5 API 25 и Pixel 3a API 30) при поиске в этой папке других папок, они, вроде как, находятся, а на моём honor 9x (Android ver. 10) не находятся.

ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);

возвращает 0.


Другими словами, я ищу следующую папку:

  1. Включаю телефон, Нажимаю на значёк "Файлы", Выбираю место "Телефон", и вижу папки: Android, DCIM, Download, Movies, Music, Telegram, VK и ещё какие-то...
  2. Подключаю тф к компу, выбираю передачу файлов, открывается папка, а в ней папка "Внутренняя память", а в ней те же папки, что и в п.1.

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

Автор решения: WhiteBite

Пример получения папки Downloads

Из фрагмента

val downloadFolder = requireContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS

Из активити

val downloadFolder = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
→ Ссылка
Автор решения: Style-7

Сначала нужно определиться с понятиями внутреннее или внешнее хранилище (или память).

Внешнее хранилище не означает, что это обязательно SD карта, хотя на старых Андроидах так и было и метод getExternalFilesDir мог вернуть null. Принципиальное отличие состоит в том, что к папке getFilesDir имеет доступ только ваше приложение, а getExternalFilesDir все приложения и пользователь.

В них может находиться все, что угодно и это тоже не способ идентификации.

→ Ссылка
Автор решения: Barmaley

Здесь очень много терминологии :)

По прогерски:

  1. Internal storage - это то что доступно только приложению - возвращается через Context.getFilesDir()
  2. External storage - это все другое (не только SD карта, но также и внутреннее хранилище телефона)
  3. Primary External storage - несьемная память аппарата
  4. Secondary External storage - SD карта или USB носитель

По юзерски:

  1. Internal memory - внутренняя память телефона
  2. External memory - внешняя память телефона (SD карта, USB носитель и т.д.)

Так вот все доки/вызовы API трактуют именно прогерское понимание - учитывайте это.

Теперь к сути вопроса.

Environment.getExternalStorageDirectory() - уже довольно давно объявлен устаревшим. Сейчас все активно переходят на т.н. ScopedStorage.

Подробнее можно почитать здесь или здесь

→ Ссылка