Требуется разрешение на запись во внешнее хранилище. Хранение файлов

Facebook Google Plus Запрет доступа или проблема с разрешением на доступ к файлу/папке на внешнем диске

Иногда при подключении внешнего диска к компьютеру с ОС Windows 2000 Pro, XP или Vista приходится присваивать разрешения/привилегии. Поскольку файлы принадлежат другой учетной записи, при попытке открыть диск или папку на нем может появиться ошибка "Доступ запрещен" или "Недоступно".

Сведения о передаче права собственности текущему пользователю в XP Professional см. ниже. Эти инструкции относятся и к Windows Vista .
( XP Home .)

Чтобы передать права владения текущему пользователю в Windows XP HOME :

  • Загрузитесь в безопасном режиме.
  • Щелкните правой кнопкой мыши нужный файл/папку и откройте раздел Properties (Свойства).
  • Последовательно щелкните Security (Безопасность) > Advanced (Дополнительно) > Owner (Владелец) и выделите учетную запись пользователя на компьютере, который должен стать владельцем этих файлов и папок.
    Установите флажок "Replace owner on subcontainers and folders (Заменить владельца подконтейнеров и объектов)", чтобы все файлы в папке могли наследовать изменения (только при изменении разрешений папки).
  • При появлении сообщения "Вы не имеете разрешения на чтение содержимого папки [имя папки ]. Хотите заменить разрешения для этой папки так, чтобы иметь права полного доступа? Все разрешения будут заменены, если нажать кнопку "Да"" нажмите кнопку Да .
  • См. следующие статьи центра поддержки Microsoft:

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

    Для восстановления этих файлов нужно снова подключить диск к исходному компьютеру. Файлы зашифрованы без использования ПО Seagate. Дополнительные сведения см. в следующих статьях базы знаний Microsoft:

    Наконец, возможно повреждение файловой структуры.

    • Запустите проверку диска , чтобы попытаться устранить повреждение.
    • При повреждении раздела выполните описанные выше действия.

    УКАЗАНИЕ СТОРОННИХ РАЗРАБОТЧИКОВ И ВЕБ-САЙТОВ. Компания Seagate указывает сторонних разработчиков и сторонние продукты исключительно в информативных целях, не отдавая предпочтения и не давая рекомендаций (прямо или косвенно) ни одной из упоминаемых компаний. Компания Seagate не дает никаких гарантий (включая косвенные и любые иные) в отношении производительности и надежности таких компаний и продуктов. Компания Seagate не связана ни с одной из упоминаемых компаний и не контролирует их работу, поэтому не берет на себя никакой ответственности в связи с ними и отказывается от любых обязательств в отношении действий или продукции упоминаемых компаний. Прежде чем вести дела с какой-либо компанией, проведите собственную независимую оценку. За техническими характеристиками и информацией о гарантии обращайтесь напрямую к соответствующему производителю. В данном документе приводятся ссылки на веб-сайты сторонних компаний, которые Seagate не контролирует. Такие ссылки приводятся для удобства и используются на собственный риск пользователя. Компания Seagate не дает никаких гарантий в отношении материалов, представленных на таких веб-сайтах, не подтверждает их и не берет на себя никакой ответственности за них или за пользование упомянутыми веб-сайтами.

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

    Выбор между внутренним и внешним хранилищем

    Все устройства под Android имеют два пространства для хранения файлов: внешнее и внутреннее хранилища. Эти названия остались от первых устройств на Android. На большинстве устройств применялась энергозависимая память (внутреннее хранилище ) и съемные устройства, вроде microSD карт (внешнее хранилище ). На некоторых устройствах постоянное место хранения делится между внутренним и внешним разделами, поэтому даже без SD карт у нас будет и “внутреннее” и “внешнее” пространство. При этом для API неважно располагается ли внешнее пространство на съемном устройстве или нет. В списке приведены общие факты об обоих типах пространства:

    • Внутреннее хранилище:
    • Всегда доступно.
    • По умолчанию доступ к файлам разрешен только для приложений, создавших эти файлы.
    • При удалении приложения, из внутреннего хранилища удаляются все файлы приложения.
    • Внутреннее хранилище лучше подходит, если вы хотите быть уверены, что другие приложения не получат доступ к данным.
    • Внешнее хранилище:
    • Не всегда доступно, поскольку пользователь может вытащить съемную память из устройства.
    • Файлы могут быть прочитаны любым приложением.
    • При удалении приложения файлы будут удалены только в том случае, если вы сохранили их в директории, полученной с помощью метода getExternalFilesDir() .
    • Внешнее хранилище – это отличное место для файлов, которые не нуждаются в особой секретности. Также во внешних хранилищах могут храниться файлы, которые могут быть открыты на компьютере пользователя или те, которые вы хотите использовать сразу в нескольких приложениях.
    Получение прав для внешнего хранилища

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

    ...

    < manifest . . . >

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

    . . .

    < / manifest >

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

    ...

    < manifest . . . >

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

    . . .

    < / manifest >

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

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

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

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

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

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

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

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

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

    String filename = "myfile"; String string = "Hello world!"; FileOutputStream outputStream; try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); }

    String filename = "myfile" ;

    String string = "Hello world!" ;

    FileOutputStream outputStream ;

    try {

    outputStream = openFileOutput (filename , Context . MODE_PRIVATE ) ;

    outputStream . write (string . getBytes () ) ;

    outputStream . close () ;

    } catch (Exception e ) {

    e . printStackTrace () ;

    Или если необходимо создать временный файл, используйте createTempFile() . В следующем примере метод получает имя файла из URL и создает файл с указанным именем во внутренней временной директории:

    public File getTempFile(Context context, String url) { File file; try { String fileName = Uri.parse(url).getLastPathSegment(); file = File.createTempFile(fileName, null, context.getCacheDir()); catch (IOException e) { // Ошибка при создании файла } return file; }

    public File getTempFile (Context context , String url ) {

    File file ;

    try {

    String fileName = Uri . parse (url ) . getLastPathSegment () ;

    file = File . createTempFile (fileName , null , context . getCacheDir () ) ;

    catch (IOException e ) {

    // Ошибка при создании файла

    return file ;

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

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

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

    /* Проверяем хранилище на доступность чтения и записи*/ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } /* Проверяем внешнее хранилище на доступность чтения */ public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false; }

    /* Проверяем хранилище на доступность чтения и записи*/

    public boolean isExternalStorageWritable () {

    if (Environment . MEDIA_MOUNTED . equals (state ) ) {

    return true ;

    return false ;

    /* Проверяем внешнее хранилище на доступность чтения */

    public boolean isExternalStorageReadable () {

    String state = Environment . getExternalStorageState () ;

    if (Environment . MEDIA_MOUNTED . equals (state ) ||

    Environment . MEDIA_MOUNTED_READ_ONLY . equals (state ) ) {

    return true ;

    return false ;

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

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

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

    public File getAlbumStorageDir(String albumName) { // Получение публичного каталога картинок File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }

    public File getAlbumStorageDir (String albumName ) {

    // Получение публичного каталога картинок

    File file = new File (Environment . getExternalStoragePublicDirectory (

    Environment . DIRECTORY_PICTURES ) , albumName ) ;

    if (! file . mkdirs () ) {

    Log . e (LOG_TAG , "Directory not created" ) ;

    return file ;

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

    Пример создания директории собственного фотоальбома:

    public File getAlbumStorageDir(Context context, String albumName) { // Получение приватной директории для фотоальбома приложения File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }

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

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

    Запрос свободного пространства

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

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

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

    С помощью OneDrive вы можете обмениваться фотографиями, документами Microsoft Office, другими файлами и целыми папками. Файлы и папки, которые хранятся в OneDrive являются частными, пока вы не предоставите к ним общий доступ. Вы можете прекратить доступ в любое время.

    Примечание: Общий доступ ограничен в базовой или предназначенной только для хранения версии OneDrive. Ограничения сбрасываются через 24 часа, но вы можете для повышения предельного объема файлов общего доступа и получения дополнительных функций общего доступа.

    Создание ссылки

    Однако этим ссылкам по умолчанию присвоено разрешение на изменение. Если нужно предоставить пользователю только разрешение на просмотр, потребуется использовать веб-сайт OneDrive, чтобы создать ссылку (или изменить созданную).

    Электронная почта

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


    Примечания:

    Предоставление получателям дополнительных возможностей контроля и совместной работы в общих папках

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

      Чтобы предоставить общий доступ к папке с помощью ссылки : щелкните Получить ссылку и в окне Общий доступ выберите Любой пользователь, у которого есть ссылка, может изменять этот элемент .

      Чтобы предоставить общий доступ к папке по электронной почте : выберите Отправить по электронной почте и в окне Общий доступ выберите Можно изменять .

    Совет: Получатель сможет добавить в свое хранилище OneDrive общие папки, а не отдельные файлы. Если вы хотите, чтобы получатель добавил в OneDrive файлы, сначала поместите их в папку, а затем предоставьте к ней доступ.

    Просмотр перечня элементов, которыми вы поделились

    В OneDrive.com выберите на панели слева пункт Общие , а затем нажмите Я делюсь .

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

    Создание копируемой ссылки на файл или папку

    Другой способ предоставить общий доступ - создать ссылку на файл или папку, которую можно скопировать и вставить в текстовом сообщении или на веб-сайте. Пользователи, которым вы предоставляете доступ к этим ссылкам, могут пересылать их другим.

    Примечания:

    Предоставление общего доступа в мобильном приложении OneDrive

    Дополнительные сведения см. в следующих статьях:

    Дополнительные сведения

    Справка в Интернете
    См. другие страницы справки по OneDrive и OneDrive для бизнеса .
    Сведения о мобильном приложении OneDrive см. в статье Устранение неполадок с мобильным приложением OneDrive .

    Поддержка по электронной почте
    Если вам нужна помощь, встряхните мобильное устройство, когда на нем открыто приложение OneDrive, или отправьте сообщение группе поддержки OneDrive по электронной почте . Чтобы обратиться в службу поддержки OneDrive для бизнеса, на ПК с Windows или компьютере Mac щелкните значок OneDrive в области уведомлений либо строке меню, а затем выберите Другое > Отправить отзыв > Мне кое-что не нравится .

    OneDrive для бизнеса Также для администраторов могут быть полезными сообщество Tech Community по вопросам OneDrive для бизнеса , справка для администраторов OneDrive для бизнеса и обращение в службу поддержки Office 365 для бизнеса .

    Разрешения определяют, какие данные или функции доступны приложению из Google Play. Их можно настроить при установке программы на устройство с ОС Android 6.0 и более поздних версий. Например, иногда приложения запрашивают доступ к контактам или информации о местоположении. Настроить разрешения можно также после установки.

    Совет. Чтобы узнать свою версию Android, откройте настройки устройства и выберите О телефоне , О планшете или Об устройстве .

    Новые приложения

    Некоторые приложения из Play Маркета запрашивают доступ к данным перед установкой. На устройстве с ОС Android 6.0 или более поздней версии вы также можете настроить разрешения во время работы с программой.

    Приложения, установленные на устройстве

    При обновлении установленного приложения его разрешения могут измениться.

    Автоматическое обновление

    Приложения для ОС Android 6.0 и более поздних версий. Вам не нужно подтверждать или предоставлять разрешения. Приложение запросит их, когда ему впервые потребуется доступ к данным или функции.

    Другие приложения. Вам не нужно предоставлять разрешения, если вы сделали это ранее. Если приложению потребуются дополнительные права, система предложит принять или отклонить обновление.

    Чтобы проверять все новые версии самостоятельно, отключите функцию автообновления. О том, как это сделать, рассказано ниже.

    Как отключить автообновление

    Выберите подходящую инструкцию.

    Как отключить автообновление для отдельного приложения Как отключить автообновление для всех приложений Приложения с мгновенным запуском

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

    Настройка разрешений

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

    Примечание. Если вы используете аккаунт Google в образовательной, государственной или коммерческой организации, администратор может управлять некоторыми разрешениями с помощью приложения Device Policy .

    Установленное приложение

    Приложение с мгновенным запуском

    Все установленные приложения с определенными разрешениями Как проверить разрешения приложения, которое работает некорректно

    Если в приложении возникают ошибки, выполните действия ниже.

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

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

    Все Android устройства имеют две области хранения файлов: "внутреннее" и "внешнее" хранилище. Эти названия пришли из первых дней Android, когда предлагалось, что большинство устройств предоставляют встроенную постоянную неизменную память (внутреннее хранилище), а также съемный носитель, такое как микро SD карта(внешнее хранилище). Некоторые устройства делят места постоянного хранения на "внутренние" и "внешние" разделы, т.е. даже без съемного носителя, всегда есть два хранилища, и поведение API для внешнего хранилища такое же, не зависимо от того, является ли оно съемным или нет. Следующие списки обобщают факты о каждом хранилище.

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

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

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

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

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

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

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

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

    ...

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

    ...

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

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

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

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

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

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

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

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

    String filename = "myfile"; String string = "Hello world!"; FileOutputStream outputStream; try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); }

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

    Public File getTempFile(Context context, String url) { File file; try { String fileName = Uri.parse(url).getLastPathSegment(); file = File.createTempFile(fileName, null, context.getCacheDir()); catch (IOException e) { // Error while creating file } return file; }

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

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

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

    /* Checks if external storage is available for read and write */ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } /* Checks if external storage is available to at least read */ public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false; }

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

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

    Например, фотографии, сделанные с помощью приложения, или другие загруженные файлы.

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

    Например, дополнительные ресурсы загруженные вашим приложения или временные медиа-файлы.

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

    Public File getAlbumStorageDir(String albumName) { // Get the directory for the user"s public pictures directory. File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }

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

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

    Public File getAlbumStorageDir(Context context, String albumName) { // Get the directory for the app"s private pictures directory. File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }

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

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

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

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

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

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

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

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

    MyFile.delete();

    Если файл сохранен во внутреннем хранилище, вы также можете попросить Context найти и удалить файл, вызвав deleteFile() :

    MyContext.deleteFile(fileName);

    Примечание: Когда пользователь удаляет ваше приложение, Android система удаляет следующее:

    • Все файлы, сохраненные во внутреннем хранилище
    • Все файлы, сохраненные на внешнем накопителе, используя getExternalFilesDir() .

    Тем не менее, вы должны вручную удалить все файлы из кэша, созданные с помощью getCacheDir() на регулярной основе, а также регулярно удалять другие файлы, которые вам больше не нужны.

    mob_info