Как сохранить файл на андроиде

Обновлено: 02.07.2024

Работа с настройками уровня activity и приложения позволяет сохранить небольшие данные отдельных типов (string, int), но для работы с большими массивами данных, такими как графически файлы, файлы мультимедиа и т.д., нам придется обращаться к файловой системе.

ОС Android построена на основе Linux. Этот факт находит свое отражение в работе с файлами. Так, в путях к файлам в качестве разграничителя в Linux использует слеш "/", а не обратный слеш "\" (как в Windows). А все названия файлов и каталогов являются регистрозависимыми, то есть "data" это не то же самое, что и "Data".

Приложение Android сохраняет свои данные в каталоге /data/data/<название_пакета>/ и, как правило, относительно этого каталога будет идти работа.

Для работы с файлами абстрактный класс android.content.Context определяет ряд методов:

boolean deleteFile (String name) : удаляет определенный файл

String[] fileList () : получает все файлы, которые содержатся в подкаталоге /files в каталоге приложения

File getCacheDir() : получает ссылку на подкаталог cache в каталоге приложения

File getDir(String dirName, int mode) : получает ссылку на подкаталог в каталоге приложения, если такого подкаталога нет, то он создается

File getExternalCacheDir() : получает ссылку на папку /cache внешней файловой системы устройства

File getExternalFilesDir(String type) : получает ссылку на каталог /files внешней файловой системы устройства

File getFileStreamPath(String filename) : возвращает абсолютный путь к файлу в файловой системе

FileInputStream openFileInput(String filename) : открывает файл для чтения

FileOutputStream openFileOutput (String name, int mode) : открывает файл для записи

Все файлы, которые создаются и редактируются в приложении, как правило, хранятся в подкаталоге /files в каталоге приложения.

Для непосредственного чтения и записи файлов применяются также стандартные классы Java из пакета java.io.

Итак, применим функционал чтения-записи файлов в приложении. Пусть у нас будет следующая примитивная разметка layout:

Поле EditText предназначено для ввода текста, а TextView - для вывода ранее сохраненного текста. Для сохранения и восстановления текста добавлены две кнопки.

Теперь в коде Activity пропишем обработчики кнопок с сохранением и чтением файла:

При нажатии на кнопку сохранения будет создаваться поток вывода FileOutputStream fos = openFileOutput(FILE_NAME, MODE_PRIVATE)

В данном случае введенный текст будет сохраняться в файл "content.txt". При этом будет использоваться режим MODE_PRIVATE

Система позволяет создавать файлы с двумя разными режимами:

MODE_PRIVATE : файлы могут быть доступны только владельцу приложения (режим по умолчанию)

MODE_APPEND : данные могут быть добавлены в конец файла

Поэтому в данном случае если файл "content.txt" уже существует, то он будет перезаписан. Если же нам надо было дописать файл, тогда надо было бы использовать режим MODE_APPEND:

Для чтения файла применяется поток ввода FileInputStream :

В итоге после нажатия кнопки сохранения весь текст будет сохранен в файле /data/data/название_пакета/files/content.txt

Сохранение и открытие файлов в Android и Java

Где физически находится созданный файл? Чтобы увидеть его на подключенном устройстве перейдем в Android Stud в меню к пункту View -> Tool Windows -> Device File Explorer

Device File Explorer в Android Studio

После этого откроектся окно Device File Explorer для просмотра файловой системы устройства. И в папке data/data/[название_пакета_приложения]/files мы сможем найти сохраненный файл.

Работа с файлами в Android не сильно отличается от таковой в Java. В этом уроке рассмотрим, как записать/прочесть файл во внутреннюю память и на SD-карту.

Project name: P0751_Files
Build Target: Android 2.3.3
Application name: Files
Package name: ru.startandroid.develop.p0751files
Create Activity: MainActivity

Заполним strings.xml:

Рисуем экран main.xml:

4 кнопки, смысл которых понятен по тексту на них.

MainActivity.java:

В onclick обрабатываем нажатия 4-х кнопок и вызываем соответствующие методы.

writeFile – запись файла во внутреннюю память. Используется метод openFileOutput, который на вход берет имя файла и режим записи: MODE_PRIVATE – файл доступен только этому приложению, MODE_WORLD_READABLE – файл доступен для чтения всем, MODE_WORLD_WRITEABLE - файл доступен для записи всем, MODE_APPEND – файл будет дописан, а не начат заново.

readFile – чтение файла из внутренней памяти. Используем метод openFileInput, принимающий на вход имя файла. Здесь и в методе записи внутреннего файла вы можете задать только имя файла, а каталог для ваших файлов вам уже выделен.

writeFileSD – запись файла на SD. Используем метод getExternalStorageState для получения состояния SD-карты. Здесь можно посмотреть какие бывают состояния. Нам нужно MEDIA_MOUNTED – когда SD-карта вставлена и готова к работе. Далее мы получаем путь к SD-карте (метод getExternalStorageDirectory), добавляем свой каталог и имя файла, создаем каталог и пишем данные в файл.

readFileSD – чтение файла с SD. Все аналогично предыдущему методу, только файл не пишем, а читаем.

Осталось в манифест добавить разрешение на работу с файлами на SD - android.permission.WRITE_EXTERNAL_STORAGE.

Все сохраним и запустим. Видим экран с 4-мя кнопками:


Внутренняя память

Жмем кнопку Записать файл. Видим в логе:

Проверим. Идем в File Explorer (Window > Show View > Other > Android > File Explorer) и открываем там папку data/data/ru.startandroid.develop.p0751files/files и видим там наш файл file.

Возвращаемся в эмулятор. Жмем Прочесть файл и в логе видим:

Это тот текст, который мы записывали в файл.

SD карта

Теперь жмем Записать файл на SD.

Файл записан на SD: /mnt/sdcard/MyFiles/fileSD

Проверяем. Идем в FileExplorer и открываем там папку mnt/sdcard/MyFiles/ а в ней файл fileSD.

Возвращаемся в эмулятор и жмем кнопку Прочесть файл с SD. В логе видим:

Содержимое файла на SD

Этот текст мы и записывали.

mnt/sdcard - обычно этот путь ведет к содержимому SD-карты. Возможно у вас он будет другой.

В общем, при работе с файлами на SD вы используете стандартные java механизмы. А при работе с внутренним хранилищем для удобства можно использовать методы-оболочки от Activity:

openFileOutput – открыть файл на запись

openFileInput – открыть файл на чтение

И есть метод getFilesDir – возвращает объект File, соответствующий каталогу для файлов вашей программы. Используйте его, чтобы работать напрямую, без методов-оболочек.

Подробности работы в java с файловой системой я здесь описывать не буду. На нашем форуме пользователь SKR сделал отличную памятку по работе с файлами. Скорее всего, вы найдете там все что нужно.

Если у вас проверка SD-карты показывает, что карта недоступна (см. лог), то убедитесь в свойствах AVD, что у вас для SDCard указан Size или File. Если указаны, то попробуйте перезапустить AVD.

На следующем уроке:

- создаем экран с вкладками
- используем иконку в названии вкладки
- используем обработчик перехода между вкладками

- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

- новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Менеджер загрузок позволяет просматривать загружаемые файлы и управлять ими.

Загрузить файл

Остановить, возобновить и отменить загрузку

Откройте панель уведомлений Android (сдвиньте вниз верхний край экрана смартфона).

Открыть загруженный файл

Откройте панель уведомлений Android (сдвиньте вниз верхний край экрана смартфона). Во всплывающем окне выберите приложение, в котором откроется файл (окно появляется, если данному типу файла не назначено приложение по умолчанию).

После того как файл откроется, уведомление о нем не будет отображаться на панели.

Примечание. Загрузки можно открыть только на открытой вкладке. Нажмите Загрузки . Откроется список загруженных файлов в менеджере загрузок устройства. Во всплывающем окне выберите приложение, в котором откроется файл (окно появляется, если данному типу файла не назначено приложение по умолчанию). Выберите Загрузки &nbsp;→ Открыть загрузки. Откроется список загруженных файлов в менеджере загрузок устройства. Напротив файла нажмите &nbsp;→ Открыть в. и выберите приложение, в котором хотите открыть файл.

Просмотреть загрузки

Примечание. Загрузки можно открыть только на открытой вкладке.

Список загруженных файлов откроется в менеджере загрузок устройства.

Удалить загруженные файлы

Примечание. Загрузки можно открыть только на открытой вкладке. Нажмите Загрузки . Откроется список загруженных файлов в менеджере загрузок устройства. Выделите нужный файл и удалите его средствами менеджера загрузок. Выберите Загрузки &nbsp;→ Открыть загрузки. Откроется список загруженных файлов в менеджере загрузок устройства.

Очистить все загрузки

Чтобы удалить все загруженные файлы:

Отключите все остальные опции (если вы хотите очистить только загрузки).

Папка с загрузками

Приложение Яндекс по умолчанию загружает файлы в системную папку Загрузки . Чтобы посмотреть путь к ней:

Если у вас есть SD-карта, вы можете хранить загрузки на ней, экономя память устройства. Для этого:

  • Папка для хранения изменится, но уже загруженные файлы останутся на старом месте.

Если вы перенесли загрузки на SD-карту, вы можете снова загружать файлы в память устройства:

  • Папка для хранения изменится, но уже загруженные файлы останутся на старом месте.

Сохранить страницу в виде PDF-файла

Откроется стандартное приложение для печати и сохранения в PDF.

Чтобы открыть сохраненный PDF-файл, на открытой вкладке нажмите &nbsp;→ Загрузки .

","prev_next":<"prevItem":<"disabled":false,"title":"Коллекции","link":"/support/yandex-app-android/app/collection.html">,"nextItem":>,"breadcrumbs":[,],"useful_links":null,"meta":,"voter":","extra_meta":[>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>],"title":"Загрузка файлов - Приложение Яндекс для Android. Справка","productName":"Приложение Яндекс для Android","extra_js":[[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>],[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>],[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>]],"extra_css":[[],[,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>],[,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>]],"csp":<"script-src":[]>,"lang":"ru">>>'>

Вы читаете справку приложения Яндекс для Android. Если у вас устройство с iOS — перейдите в справку для этой операционной системы.

Менеджер загрузок позволяет просматривать загружаемые файлы и управлять ими.

Загрузить файл

Остановить, возобновить и отменить загрузку

Откройте панель уведомлений Android (сдвиньте вниз верхний край экрана смартфона).


В строке с загружаемым файлом нажмите .

Открыть загруженный файл

Откройте панель уведомлений Android (сдвиньте вниз верхний край экрана смартфона). Во всплывающем окне выберите приложение, в котором откроется файл (окно появляется, если данному типу файла не назначено приложение по умолчанию).

После того как файл откроется, уведомление о нем не будет отображаться на панели.

Примечание. Загрузки можно открыть только на открытой вкладке.


Справа от Умной строки или внутри нее нажмите . Нажмите Загрузки . Откроется список загруженных файлов в менеджере загрузок устройства. Во всплывающем окне выберите приложение, в котором откроется файл (окно появляется, если данному типу файла не назначено приложение по умолчанию).


Нажмите значок профиля → Настройки . Выберите Загрузки → Открыть загрузки. Откроется список загруженных файлов в менеджере загрузок устройства.


Напротив файла нажмите → Открыть в. и выберите приложение, в котором хотите открыть файл.

Просмотреть загрузки

Примечание. Загрузки можно открыть только на открытой вкладке.


Справа от Умной строки или внутри нее нажмите .


Нажмите значок профиля → Настройки .

Список загруженных файлов откроется в менеджере загрузок устройства.

Удалить загруженные файлы

Примечание. Загрузки можно открыть только на открытой вкладке.


Справа от Умной строки или внутри нее нажмите . Нажмите Загрузки . Откроется список загруженных файлов в менеджере загрузок устройства. Выделите нужный файл и удалите его средствами менеджера загрузок.


Нажмите значок профиля → Настройки . Выберите Загрузки → Открыть загрузки. Откроется список загруженных файлов в менеджере загрузок устройства.


Напротив файла нажмите → Удалить .

Очистить все загрузки

Чтобы удалить все загруженные файлы:


Нажмите значок профиля → Настройки . Отключите все остальные опции (если вы хотите очистить только загрузки).

Папка с загрузками

Приложение Яндекс по умолчанию загружает файлы в системную папку Загрузки . Чтобы посмотреть путь к ней:


Нажмите значок профиля → Настройки .

Если у вас есть SD-карта, вы можете хранить загрузки на ней, экономя память устройства. Для этого:


Нажмите значок профиля → Настройки .
  • Папка для хранения изменится, но уже загруженные файлы останутся на старом месте.

Если вы перенесли загрузки на SD-карту, вы можете снова загружать файлы в память устройства:


Нажмите значок профиля → Настройки .
  • Папка для хранения изменится, но уже загруженные файлы останутся на старом месте.

Сохранить страницу в виде PDF-файла


Справа от Умной строки или внутри нее нажмите .

Откроется стандартное приложение для печати и сохранения в PDF.


Чтобы открыть сохраненный PDF-файл, на открытой вкладке нажмите → Загрузки .

Сегодня я бы хотел рассказать вам о правильной работе с файлами в ОС Android. Итак, чаще всего у новичков возникают ситуации, когда обычные Java функции не могут корректно создать тот или иной файл в системе Android.
Во-первых, вам нужно обратить внимание на интересную особенность ОС:
когда вы устанавливаете apk приложение в эмулятор или телефон, система Linux (на которой базируется ядро Android) выделяет ему специальный User-ID, который является неким ключом доступа к (sandbox). То есть другие приложения в телефоне не смогут получить доступ к чтению файлов вашего приложения просто так. Кончено, всё это сделано в целях безопасности.
В общем, если вы запустите следующий код:

FileWriter f = new FileWriter("impossible.txt");

То этот код вызовет исключение: ‘java.io.FileNotFoundException: /impossible.txt ‘
Тогда как должен в случае отсутствия файла создать его.

Далее стоит отметить, что данное ограничение не распространяется на файлы, записываемые на SDCard. Туда можно писать любые файлы без всяких проблем, правда предварительно нужно добавить в AndroidManifest разрешение на запись:

Код файла на карту:

File fileName = null;
String sdState = android.os.Environment.getExternalStorageState();
if (sdState.equals(android.os.Environment.MEDIA_MOUNTED)) File sdDir = android.os.Environment.getExternalStorageDirectory();
fileName = new File(sdDir, "cache/primer.txt");
> else fileName = context.getCacheDir();
>
if (!fileName.exists())
fileName.mkdirs();
try FileWriter f = new FileWriter(fileName);
f.write("hello world");
f.flush();
f.close();
> catch (Exception e)

>

Как уже ранее было сказано мною, android приложение находится в некой песочнице, изолированной от воздействия со стороны других приложений по умолчанию. Для того, чтобы создать файл внутри этой песочницы, следует использовать функцию openFileOutput(). Хочу отметить 2 аргумента:

1. имя файла
2. режим доступа к нему со стороны чужих приложений

С первым аргументом все ясно, что касается второго, то режимов существует два: MODE_WORLD_READABLE и/или MODE_WORLD_WRITEABLE.

И ещё, чтобы записать файл можно использовать следующий код:

final String TESTSTRING = new String("Hello Android");
FileOutputStream fOut = openFileOutput("samplefile.txt", MODE_WORLD_READABLE);
OutputStreamWriter osw = new OutputStreamWriter(fOut);
// записываем строку в файл
osw.write(TESTSTRING);
/* проверяем, что все действительно записалось и закрываем файл */
osw.flush();
osw.close();

Для чтения файлов используется метод openFileInput():

FileInputStream fIn = openFileInput("samplefile.txt");
InputStreamReader isr = new InputStreamReader(fIn);
char[] inputBuffer = new char[TESTSTRING.length()];
isr.read(inputBuffer);
String readString = new String(inputBuffer);

Для удаления используется метод deleteFile() в контексте приложения/активити. На этом я бы хотел закончить полезный пост, спасибо за внимание!

Android использует файловую систему, похожую на систему на основе дисковых файловых систем на других платформах. Этот урок описывает, как работать с файловой системой Android, чтобы читать и записывать файлы, используя File API.

File объект подходит для чтения или записи больших объемов данных с начала до конца, не пропуская ничего вокруг. Например, это хорошо подходит для файлов изображений или для обмена чем-нибудь по сети.

Этот урок показывает, как выполнять основные задачи связанные с файлами в вашем приложении. Урок предполагает, что вы знакомы с основами файловой системы Linux и стандартным API файлового ввода/вывода в java.io .

Выберите внутреннее или внешнее хранилище

Внутреннее хранилище:

  • Всегда доступно.
  • Файлы, сохраненные здесь, по умолчанию, доступны лишь вашему приложению.
  • Когда пользователь удаляет ваше приложение, система удаляет все файлы вашего приложения из внутренней памяти.

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

Внешнее хранилище:

  • Не всегда доступно, так как пользователь может смонтировать внешний накопитель в качестве USB хранилища, и в некоторых случаях вынуть его из устройства.
  • Чтение разрешено всем, поэтому файлы, сохраненные здесь, можно прочитать без вашего контроля.
  • Когда пользователь удаляет ваше приложение, система удаляет файлы вашего приложения отсюда, только если вы сохраните их в каталоге из getExternalFilesDir() .

Внешние накопители лучшее место для файлов, которые не требуют ограничения доступа, и для файлов, которыми вы хотите поделиться с другими приложениями, или хотите позволить пользователю получить доступ к ним на компьютере.

Полезный совет: Хотя приложения устанавливаются во внутреннее хранилище по умолчанию, можно указать android:installLocation атрибут в манифесте, чтобы ваше приложение могло быть установлено на внешний накопитель. Пользователи ценят эту опцию, когда размер APK очень большой, и у них есть внешнее пространство для хранения, превышающее внутреннюю память. Для получения дополнительной информации, см. Путь установки приложения.

Получите разрешения для внешних накопителей

Для записи на внешний накопитель, вы должны запросить WRITE_EXTERNAL_STORAGE разрешение в вашем файле манифеста:

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

Внимание: В настоящее время, все приложения имеют возможность читать с внешних накопителей без специального разрешения. Тем не менее, это изменится в будущем релизе. Если ваше приложение должно прочитать внешний накопитель (но не писать в него), то вам нужно будет объявить READ_EXTERNAL_STORAGE разрешение. Чтобы убедиться, что ваше приложение продолжало работать, как и ожидалось, вы должны объявить это разрешение сейчас, прежде чем изменения вступят в силу.

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

Однако, если ваше приложение использует WRITE_EXTERNAL_STORAGE разрешение, то также неявно имеет разрешение на чтение внешнего хранилища.

Вам не нужно никаких разрешений для сохранения файлов во внутреннее хранилище. Ваше приложение всегда имеет разрешение на чтение и запись файлов в каталоге внутреннего хранилища.

Сохраните файл во внутреннем хранилище

При сохранении файла во внутреннее хранилище, вы можете запросить соответствующий каталог, в виде объекта File , вызвав один из двух методов:

getFilesDir() Возвращает File представляющий собой внутренний каталог вашего приложения. getCacheDir() Возвращает File представляющий собой внутренний каталог для временных файлов кэша вашего приложения. Будьте уверены, удалять файлы по одному больше не нужено, и реализуйте разумный предел размера объема памяти, который вы будете использовать в какой-либо момент времени, например, 1 Мб. Если в системе возникает нехватка места, она может удалить ваши файлы кэша без предупреждения.

Чтобы создать новый файл в одном из этих каталогов, вы можете использовать File() конструктор, передав File предоставленный одним из выше указанных методов, который указывает на ваш внутренний каталог. Например:

File file = new File ( context . getFilesDir ( ) , filename ) ;

В качестве альтернативы, вы можете вызвать openFileOutput() для получения FileOutputStream , который пишет в файл в вашем внутреннем каталоге. Например, вот как записать текст в файл:

outputStream = openFileOutput ( filename , Context . MODE_PRIVATE ) ;

Или, если вам нужно кэшировать некоторые файлы, то следует использовать createTempFile() . Например, следующий метод извлекает имя файла из URL и создает файл с таким же именем во внутренней каталоге кэша вашего приложения:

public File getTempFile ( Context context , String url ) < String fileName = Uri . parse ( url ) . getLastPathSegment ( ) ; file = File . createTempFile ( fileName , null , context . getCacheDir ( ) ) ;

Примечание: Каталог внутреннего хранилища вашего приложения использует имя пакета вашего приложения, располагаясь в специальном месте файловой системы Android. Технически, другое приложение может читать ваши внутренние файлы, если вы установите для файла режим доступа на чтение. Тем не менее, другие приложения также должны знать ваше имя пакета и имена файлов. Другие приложения не могут просматривать ваши внутренние каталоги, и не имеют доступа для чтения или записи, если явно не установить разрешения для чтения или записи. Так что, пока вы используете MODE_PRIVATE для ваших файлов во внутренней памяти, они не являются доступными для других приложений.

Сохраните файл на внешнем накопителе

Поскольку внешнее хранилище может быть недоступно — например, когда пользователь монтируется хранилище к ПК, или вынул SD карту, которая обеспечивает внешнее хранилище — вы всегда должны убедиться, что раздел доступен перед доступом к нему. Вы можете запросить состояния внешнего хранилища, вызвав getExternalStorageState() . Если возвращенное состояние равно MEDIA_MOUNTED , то вы можете читать и писать файлы. Например, следующие методы полезны для определения доступности хранилища:

/* Checks if external storage is available for read and write */ String state = Environment . getExternalStorageState ( ) ; /* Checks if external storage is available to at least read */ String state = Environment . getExternalStorageState ( ) ; Environment . MEDIA_MOUNTED_READ_ONLY . equals ( state ) ) <

Хотя внешнее запоминающее устройство может изменяться пользователем и другими приложениями, есть две категории файлов, которые вы могли бы сохранить здесь:

Общедоступные файлы Файлы, которые должны быть в свободном доступе для других приложений и для пользователя. Когда пользователь удаляет ваше приложение, эти файлы должны оставаться доступными для пользователя.Например, фотографии, сделанные с помощью приложения, или другие загруженные файлы. Личные файлы Файлы, которые по праву принадлежат вашему приложению, и их следует удалить, когда пользователь удаляет ваше приложение. Хотя эти файлы являются технически доступными пользователю, и другим приложениям, т.к. они находятся на внешнем накопителе, это файлы, которые реально не представляют собой ценности для пользователя вне вашего приложения. Когда пользователь удаляет ваше приложение, система удаляет все файлы с внешнего приватного каталога вашего приложения.Например, дополнительные ресурсы загруженные вашим приложения или временные медиа-файлы.

Если вы хотите сохранить общедоступные файлы на внешнем устройстве хранения, используйте getExternalStoragePublicDirectory() метод для получения File представляющего соответствующий каталог на внешнем накопителе. Метод принимает аргумент, указывающий тип файла, который вы хотите сохранить, чтобы они могли быть логически организованы с другими общедоступными файлами, такими как DIRECTORY_MUSIC или DIRECTORY_PICTURES . Например:

// Get the directory for the user's public pictures directory. File file = new File ( Environment . getExternalStoragePublicDirectory (

Если вы хотите сохранять файлы, которые являются приватными для вашего приложения, вы можете запросить соответствующий каталог, вызвав getExternalFilesDir() и передать ему имя, указывающее тип необходимого каталога. Каждый каталог, созданный таким способом, добавляется в родительский каталог, который инкапсулирует все файлы внешнего хранилища вашего приложения, которые система удаляет, когда пользователь удаляет ваше приложение.

Например, вот метод, который можно использовать для создания каталога отдельного фотоальбома:

public File getAlbumStorageDir ( Context context , String albumName ) < // Get the directory for the app's private pictures directory.

Если ни одно из предопределенных имен подкаталогов не удовлетворяет вашим файлам, вы можете вместо этого вызвать getExternalFilesDir() и передать null . При это возвращается корневой каталог для приватных каталогов вашего приложения на внешнем накопителе.

Помните, что getExternalFilesDir() создает каталог внутри каталога, который удаляется, когда пользователь удаляет ваше приложение. Если сохраненные файлы должны оставаться доступными после того как пользователь удаляет ваше приложение — например, когда ваше приложение представляет собой камеру, и пользователь захочет сохранить фотографии — то следует использовать getExternalStoragePublicDirectory() .

Независимо от того, используете ли вы getExternalStoragePublicDirectory() для файлов, которые являются общими или getExternalFilesDir() для файлов, которые являются приватными для вашего приложения, важно, что вы используете имена каталогов, предоставляемые константами API, такими как DIRECTORY_PICTURES . Эти имена каталогов гарантируют, что файлы будут интерпретироваться системой должным образом. Например, файлы, сохраненные в DIRECTORY_RINGTONES классифицируются по системе медиа сканера как мелодии звонка вместо музыки.

Запросите свободное пространство

Если вы знаете заранее, сколько данных вы будете сохранять, вы можете выяснить, есть ли в наличие достаточно места, не вызывая IOException с помощью вызова getFreeSpace() или getTotalSpace() . Эти методы предоставляют информацию о текущем доступном пространстве и общем пространстве раздела, соответственно. Эта информация также полезна, чтобы избежать заполнения раздела накопителя выше определенного порога.

Тем не менее, система не гарантирует, что вы можете записать столько байт, сколько обозначено getFreeSpace() . Если возвращаемое число на несколько МБ больше, чем размер данных, которые вы хотите сохранить, или если файловая система заполнена меньше чем на 90%, то, наверное, можно продолжить. В противном случае, вероятно, не стоит записывать в хранилище.

Примечание: Вы не обязаны проверять количество свободного места, прежде чем вы сохраняете файл. Вместо этого, вы можете попробовать записать файл, и поймать IOException если оно произойдет. Возможно, вам придется сделать так, если вы не знаете точно, сколько места нужно. Например, если вы измените кодировку файла перед сохранением путем преобразования PNG изображения в JPEG, вы не будете знать размер файла заранее.

Удаление файла

Вы всегда должны удалить файлы, которые вам больше не нужны. Самый простой способ удалить файл это вызвать delete() .

Читайте также: