Хранение файлов. Строим домашнюю сеть. Сетевой накопитель Как открыть доступ к хранилищу на телефон

Последнее обновление: 21.03.2017

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

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

Итак, пусть в файле activity_main.xml будет такая же разметка интерфейса:

А код класса MainActivity будет выглядеть следующим образом:

Package com.example.eugene.filesapp; import android.Manifest; import android.content.pm.PackageManager; import android.os.Environment; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity { private final static String FILE_NAME = "content.txt"; private static final int REQUEST_PERMISSION_WRITE = 1001; private boolean permissionGranted; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } private File getExternalPath() { return(new File(Environment.getExternalStorageDirectory(), FILE_NAME)); } // сохранение файла public void saveText(View view){ if(!permissionGranted){ checkPermissions(); return; } FileOutputStream fos = null; try { EditText textBox = (EditText) findViewById(R.id.save_text); String text = textBox.getText().toString(); fos = new FileOutputStream(getExternalPath()); fos.write(text.getBytes()); Toast.makeText(this, "Файл сохранен", Toast.LENGTH_SHORT).show(); } catch(IOException ex) { Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } finally{ try{ if(fos!=null) fos.close(); } catch(IOException ex){ Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } } } // открытие файла public void openText(View view){ if(!permissionGranted){ checkPermissions(); return; } FileInputStream fin = null; TextView textView = (TextView) findViewById(R.id.open_text); File file = getExternalPath(); // если файл не существует, выход из метода if(!file.exists()) return; try { fin = new FileInputStream(file); byte bytes = new byte; fin.read(bytes); String text = new String (bytes); textView.setText(text); } catch(IOException ex) { Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } finally{ try{ if(fin!=null) fin.close(); } catch(IOException ex){ Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } } } // проверяем, доступно ли внешнее хранилище для чтения и записи public boolean isExternalStorageWriteable(){ String state = Environment.getExternalStorageState(); return Environment.MEDIA_MOUNTED.equals(state); } // проверяем, доступно ли внешнее хранилище хотя бы только для чтения public boolean isExternalStorageReadable(){ String state = Environment.getExternalStorageState(); return (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)); } private boolean checkPermissions(){ if(!isExternalStorageReadable() || !isExternalStorageWriteable()){ Toast.makeText(this, "Внешнее хранилище не доступно", Toast.LENGTH_LONG).show(); return false; } int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); if(permissionCheck!= PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this, new String{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_WRITE); return false; } return true; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions, @NonNull int grantResults){ switch (requestCode){ case REQUEST_PERMISSION_WRITE: if(grantResults.length > 0 && grantResults == PackageManager.PERMISSION_GRANTED){ permissionGranted = true; Toast.makeText(this, "Разрешения получены", Toast.LENGTH_LONG).show(); } else{ Toast.makeText(this, "Необходимо дать разрешения", Toast.LENGTH_LONG).show(); } break; } } }

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

Private File getExternalPath() { return(new File(Environment.getExternalStorageDirectory(), FILE_NAME)); }

Поскольку для чтения/записи во внешнее хранилище необходимы разрешения, то перед операциями сохранения и записи файла необходимо проверить наличие разрешений. Для этого определен метод checkPermissions() . При установке разрешений срабатывает метод onRequestPermissionsResult() , в котором в случае удачной установки разрешений для переменной permissionGranted задается значение true .

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

//............................

Предположим, что у вас на компьютере хранятся файлы и папки, к которым хорошо бы иметь доступ всегда и везде, т.е. – открыть и посмотреть, а также иметь возможность скачать и отредактировать их с любого устройства (планшет, смартфон, другой компьютер) и из любой точки, где вы можете выйти в интернет.
Всё это очень удобно когда вы регулярно обращаетесь к каким-то заметкам, таблицам, текстам. Находитесь вы, например, в дороге или в любом месте, где не можете сесть за свой компьютер. А доступ к некоторым файлам вам нужен прямо сейчас чтобы просто посмотреть какую-то информацию или возможно внести срочно небольшие изменения, пока вы про это не забыли. В таких случаях вы сможете всегда иметь доступ к нужным вам файлам если загрузите их на специальные бесплатные онлайн-хранилища (диски). Основные из них: Яндекс-Диск, Облако Mail, Google-Диск, Microsoft OneDrive и Mega. Файлы будут храниться в интернете в защищённом пространстве под вашим паролем, и открыть их можно с любого устройства и из любой точки при помощи бесплатных приложений! Нужна лишь возможность выхода в интернет. Да, и ещё один важный момент. Хранение файлов в онлайн-хранилищах защитит вас от потери данных, в случае если с вашим компьютером что-то случится.

К примеру – сломался жёсткий диск, украли и так далее. Ведь все важные данные будут храниться одновременно в защищённых хранилищах в интернете, откуда вы сможете их беспрепятственно восстановить.

В предыдущей статье я рассказывал о полноценном удалённом доступе к компьютеру с любого другого устройства и возможно кто-то подумает: «А почему бы не воспользоваться тогда просто удалённым доступом?». В таком случае данный вариант не эффективен и гораздо менее удобен по следующим причинам:

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

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

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

Удалённый доступ к компьютеру нужен не для таких целей, а тогда, когда вам может понадобиться вход в какую-то программу на компьютере, произвести какие-то настройки.

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

Зарегистрироваться в нужных онлайн-хранилищах (лучше во всех основных), ведь это бесплатно!

Загрузить туда необходимые файлы, к которым вы хотели бы иметь доступ всегда и везде;

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

Но не всё же так идеально... Есть, конечно же, одно важное ограничение. Заключается оно в максимальном объёме хранимой информации на каждом из онлайн-дисков. Оно, понятное дело, не бесконечное и, как правило, рассчитано на хранение самых основных данных. Если нужно больше – нужно платить за дополнительное свободное место, либо воспользоваться различными акциями или реферальной программой, если таковые вообще имеются в нужном сервисе.

Рассмотрим основные сервисы для удалённого хранения файлов и сравним их

Яндекс-Диск .
Объём диска, доступный по умолчанию при бесплатной регистрации – 10 Гб. Также возможно получить 10 Гб за приглашение друзей (реферальная программа): 512 Мб за каждого приглашённого.
Также возможно получить дополнительное место по текущим акциям, например – 50 Гб тем, кто купит смартфон / планшет / ноутбук определённой модели. За акциями нужно следить, поскольку одни заканчиваются, другие начинаются:)

Ну и последний вариант расширения дискового пространства на Яндексе – это покупка нужного объёма.

Вот возможные варианты расширения свободного места на Яндекс-Диске:

Для сравнения цен на покупку дополнительного свободного места, возьмём объём, равный 1 терабайту (1 Тб = 1024 Гб).

Цена 1 Тб на Яндексе, как видим из изображения выше, равна 900 рублей в месяц.

Яндекс-Диск

Google-Диск .
Объём диска по умолчанию – 15 Гб. Расширение объёма за счёт различных акций и партнёрской программы не предусмотрено.
Расширить диск возможно только заплатив за месяц или год, выбрав нужный объём.

Вот какие условия нам предлагает Google-Диск:

Цена за 1 Тб равна 9.99$. Если переведём в рубли (возьмём курс доллара на 15.10.2014 = 40.5 рублей), то видим сразу что на Google цена значительно выгоднее, чем на Яндексе. 9.99 x 40.5 = примерно 404.6 рублей, вместо 900 руб.

Google-Диск

Mail-Диск .
Объём диска по умолчанию – целых 100 Гб. Разница по сравнению с Яндекс и Google приличная, как видите:) Тут всё просто и о каких-либо возможностях бесплатного и даже платного расширения дискового пространства речи на официальном сайте не идёт. Я думаю, 100 Гб халявного места никому не помешает, даже если больше заказать нельзя:)

Но есть один минус – сервис Мэйла не всегда стабилен. Вот вам, как пример:

Буквально на днях, при попытке зайти в свой аккаунт Mail в районе 1:00 по МСК, он ни в какую не принимал мой логин и пароль, говоря, что я ввожу неверные данные. Логины и пароли у меня автоматически сохраняются в программе RoboForm (прочитать о ней можно ), а также через неё автоматом заполняются и формы авторизации. И поэтому забыть их я никак не мог и ошибиться при вводе тоже. После нескольких безуспешных попыток войти, я попробовал восстановить пароль, и что вы думаете? :) Прислали новый пароль и с ним мне тоже войти не удалось. Немного разозлился и бросил это дело. Попробовал снова не следующий день и успешно вошёл с первого раза. Хотя бы даже поэтому сервисы Мэйла нельзя назвать очень стабильными:)

Облако Mail

Microsoft OneDrive .
Объём бесплатного свободного пространства после регистрации составляет 15 Гб. Как и в Яндексе, имеется возможность бесплатно расширить объём до 23 Гб. 3 Гб сервис даст за создание резервной копии фотографий с камеры и ещё +0.5 Гб за каждого приглашённого участника по реферальной программе. Максимум – 10 приглашённых, что увеличит ваш объём ещё на 5 Гб:

Что касается приобретения свободного места за плату, то тут Microsoft предлагает вот такие варианты:

Т.е. стоимость 1 Тб свободного места + офисный пакет (Office 365) для всех устройств обойдутся нам всего в 199 рублей. Правда, вероятно, такое предложение ограниченно каким-то промежутком времени.

onedrive

Mega .
Объём свободного пространства, предоставляемого бесплатно равен 50 Гб. Расширить свободное место можно только за деньги.

На сайте указана цена за 2 Тб = 19.99 евро. Рассчитаем по сегодняшнему курсу: 1 евро = 51.5 руб. Итого за 2 Тб с нас берут около 1029.5 рублей. Делим на 2 и получаем для сравнения примерную стоимость 1 Тб равную 515 руб.

Это чуть дороже, чем на Google и всё равно значительно меньше, чем на дорогом Яндексе, где берут 900 рублей за терабайт:)

Да и тем более при оплате сразу за год получаем скидки.

При всём этом сервис стабилен и удобен, замечаний у меня лично к нему пока не было…

Mega

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

Как видно, основное и главное отличие всех этих сервисов – доступный объём диска после регистрации.

Почему выделил именно эти сервисы? Главная причина как раз – объём свободного места, который предоставляется бесплатно. В них он вполне хороший. Даже на Яндексе, где бесплатно даётся объём в 10 Гб, можно его расширить до 20 Гб бесплатно, приглашая участников. Ну а в оставшихся трёх начальный объём итак выше:) У Мэйла он самый большой, но стабильность хромает…

Есть, конечно, ещё и другие облачные хранилища, но объём свободного места, предоставляемого бесплатно в них совсем невелик. Например, в Dropbox предоставляют всего 2 Гб бесплатно. Зачем нам такой объём маленький объём, если можно воспользоваться сразу 5-ю сервисами, о которых я выше писал, не так ли? Причём можно сделать в некоторых случаях и по 2 и более аккаунта в нужном облачном сервисе.

Я рекомендую регистрироваться во всех перечисленных сервисах, ведь это бесплатно! Свободного пространства для хранения данных никогда не бывает много. Не умещается всё на одном, распределяете ещё на другие и, думаю, объёма по умолчанию, если просуммировать все 5 сервисов, хватит всем вполне:)

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

Ну а сейчас на этом всё… Прощаюсь с Вами на неделю;) Пока!

Nafa 647 14.01.10 02:27 Сейчас в теме

Статья полезная.
В работе хранилища действительно очень много неочевидных вещей, поэтому мои дополнения:
1. Если работают несколько программистов, то как вариант,
рабочий день обычно начинается со следущего:
запускаем свою базу в конфигураторе, на корне конфигурации правой кнопкой мышки - получить из хранилища, включаем галочку "рекурсивно", жмем ОК. После этого в конфигурацию получаем все, что наработали другие из хранилища. САМУ БД НЕ ОБНОВЛЯЕМ!!!
Далее желаем "сравнить конфигурацию с конфигурацией БД" - и видим список все изменений сделанных другими программистами группы за предыдущий день. Если есть вопросы по изменениям- обращаемся к тому, кто их делал.
После того, как все разобрали - сохраняем в БД.
Почему не сравнить с конфигурацией хранилища - во-первых чтобы не показывались те объекты, над которым сам работаешь, во-вторых это работает быстрее.
2. В середине дня: срочные изменения (для динамического обновления) отправляем в хранилище сразу. Не срочные - после того, как изменим все связанные объекты. (см. пояснение ниже)
3. В конце дня (а если надо делать полное обновление базы - то перед ним) сдаем в хранилище все что можно.
Это не обязательный порядок, но весьма удобный.

4. Почему не помещаем сразу:
потому что целостность изменений контролируется 1С только там где есть ссылка. То есть если например вы сделали справочник "Автомобили клиентов" и добавили ссылку на него в "расходную накладную", то поместить "Расходную накладную" в хранилище Вы сможете только после (или одновременно) со справочником "Автомобили клиентов". Но если Вы например использовали этот справочник в процедуре общего модуле, которая вызывается при проведении расходной накладной, то этот общий модуль в хранилище спокойно поместиться без помещения справочника. Если после этого другой программист получит этот модуль из хранилища, то в его базе расходные накладные проводиться перестанут. (А если обновить основную базу - то и там перестанут).
И то еще хороший случай - так как возникает просто ошибка. А вот если Вы например изменили тип реквизита в документе со строки на текст и в процедуре общего модуля была проверка Если Реквизит = "1" а стала Если Реквизит = 1 и модуль в хранилище поместили а документ - нет, то ошибки не будет (привет отсутствию контроля типов), а значит у тех кто такой модуль получит документы будет неправильно проводиться, (и хорошо если это будет не основная база). Поэтому изменения лучше сдавать в хранилище "полным пакетом" (все измененные по одной теме объекты), если что-то нужно Вам для другой задачи - можно сразу же захватить по новой или просто, помещая в хранилище, "оставить захваченным".

В этом плане я не совсем понял:

Если программистов много - то изменения каждого нужно отправлять в Хранилище поочереди, ПРЕДВАРИТЕЛЬНО выгрузив у всех работу во внешние файлы с конфигурацией локальной БД и (если объединение делается с разных рабочих мест), не забывая перед каждым объединением ОБНОВЛЯТЬ локальные БД из Хранилища - до последней версии, с присутствующим там изменениями ранее подключенных товарищей..

Странно, не было никаких проблем когда несколько человек сразу изменения помещали, разве что подтормаживало малость. На то захват объектов и предусмотрен, чтобы 2 человека сразу одно и то же не исправили. Причем было замечено, что: если 1 разработчик изменил документ, скажем "Авансовый отчет", а затем второй "получения" не делал, а сразу его захватывает (например, объект только что помещен в хранилище), то 1С это отследит и сама даст ему уже новую - измененную версию. (Так прикольно бывает - смотришь на документ - 5 реквизитов, захватываешь - уже 15).

И зачем работу во внешние файлы выгружать тоже не понял.

4. Создание копий базы для программистов проще делать не 1Совской загрузкой-выгрузкой (т.к. она требует монопольного режима и не шибко шустрая), а восстановлением скульного бекапа или просто копированием базе на скуле.

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

6. Если Вы хотите исправить права доступа на объект, захватили его - а права доступа по прежнему недоступны - захватите соответствующую роль.

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

8. Когда делаем "получить все из хранилища" (п. 1) бывает, что 1с выдает кучу сообщений а потом пишет, что "не удалось" (список объектов при этом меняется). Значит давно не получали изменения. Ничего страшного, жмем ОК по новой и так до тех пор, пока не сработает, как надо.

9. Иногда 1С отказывается сохранять полученные из хранилища изменения, причем сообщение выдает абсолютно невнятное. Виновниками обычно являются "регистры сведений". Выясняем, у какого регистра сведений менялась структура, удаляем из него в своей базе все записи, после этого все обновится как надо.

10. Поскольку рабочие базы делаются из основной, то названия конфигураций совпадают и их легко перепутать и потом начинаются непонятки, когда пользователе говорит что у него в отчете 100 руб, а у Вас - 100,000 руб. Как вариант, добавляем в модуль приложения строчку, проверяющую при запуске программы что это за база и если не основная - выводящую это в заголовке программы 1С (например "РАБОЧАЯ БАЗА ПРОГРАММИСТА ИВАНОВА")

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

Android uses a file system that"s similar to disk-based file systems on other platforms. This page describes how to work with the Android file system to read and write files with the APIs.

Choose internal or external storage

All Android devices have two file storage areas: "internal" and "external" storage. These names come from the early days of Android, when most devices offered built-in non-volatile memory (internal storage), plus a removable storage medium such as a micro SD card (external storage). Many devices now divide the permanent storage space into separate "internal" and "external" partitions. So even without a removable storage medium, these two storage spaces always exist, and the API behavior is the same regardless of whether the external storage is removable.

Because the external storage might be removable, there are some differences between these two options as follows.

Tip: Although apps are installed onto the internal storage by default, you can allow your app to be installed on external storage by specifying the attribute in your manifest. Users appreciate this option when the APK size is very large and they have an external storage space that"s larger than the internal storage. For more information, see .

Save a file on internal storage

Your app"s internal storage directory is specified by your app"s package name in a special location of the Android file system that can be accessed with the following APIs.

On Android 6.0 (API level 23) and lower, other apps can read your internal files if you set the file mode to be world readable. However, the other app must know your app package name and file names. Other apps cannot browse your internal directories and do not have read or write access unless you explicitly set the files to be readable or writable. So as long as you use for your files on the internal storage, they are never accessible to other apps.

Write a cache file

If you instead need to cache some files, you should use . For example, the following method extracts the file name from a and creates a file with that name in your app"s internal cache directory:

Kotlin private fun getTempFile(context: Context, url: String): File? = Uri.parse(url)?.lastPathSegment?.let { filename -> File.createTempFile(filename, null, context.cacheDir) } Java private 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; }

Tip: If you need to package a file in your app that is accessible at install time, save the file in your project"s res/raw/ directory. You can open these files with , passing the R.raw. filename resource ID. This method returns an that you can use to read the file. You cannot write to the original file.

Open a directory

You can open a directory on the internal file system with the following methods:

Returns a representing the directory on the file system that"s uniquely associated with your app. Creates a new directory (or opens an existing directory) within your app"s unique file system directory. This new directory appears inside the directory provided by . Returns a representing the cache directory on the file system that"s uniquely associated with your app. This directory is meant for temporary files, and it should be cleaned up regularly. The system may delete files there if it runs low on disk space, so make sure you check for the existence of your cache files before reading them.

To create a new file in one of these directories, you can use the constructor, passing the object provided by one of the above methods that specifies your internal storage directory. For example:

Kotlin val directory = context.filesDir val file = File(directory, filename) Java File directory = context.getFilesDir(); File file = new File(directory, filename); Save a file on external storage

Using the external storage is great for files that you want to share with other apps or allow the user to access with a computer.

Request external storage permissions

To write to the public external storage, you must request the permission in your :

... ...

Beginning with Android 4.4 (API level 19), reading or writing files in your app"s private external storage directory-accessed using -does not require the or permissions. So if your app supports Android 4.3 (API level 18) and lower, and you want to access only the private external storage directory, you should declare that the permission be requested only on the lower versions of Android by adding the attribute:

...

Verify that external storage is available

Because the external storage might be unavailable—such as when the user has mounted the storage to a PC or has removed the SD card that provides the external storage—you should always verify that the volume is available before accessing it. You can query the external storage state by calling . If the returned state is , then you can read and write your files. If it"s , you can only read the files.

For example, the following methods are useful to determine the storage availability:

Kotlin /* Checks if external storage is available for read and write */ fun isExternalStorageWritable(): Boolean { return Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED } /* Checks if external storage is available to at least read */ fun isExternalStorageReadable(): Boolean { return Environment.getExternalStorageState() in setOf(Environment.MEDIA_MOUNTED, Environment.MEDIA_MOUNTED_READ_ONLY) } Java /* 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; } Save to a public directory

If you want to save public files on the external storage, use the method to get a representing the appropriate directory on the external storage. The method takes an argument specifying the type of file you want to save so that they can be logically organized with other public files, such as or . For example:

Kotlin fun getPublicAlbumStorageDir(albumName: String): File? { // Get the directory for the user"s public pictures directory. val file = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName) if (!file?.mkdirs()) { Log.e(LOG_TAG, "Directory not created") } return file } Java public File getPublicAlbumStorageDir(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; }

If you want to hide your files from the Media Scanner, include an empty file named .nomedia in your external files directory (note the dot prefix in the filename). This prevents media scanner from reading your media files and providing them to other apps through the content provider.

Save to a private directory

If you want to save files on external storage that are private to your app and not accessible by the content provider, you can acquire a directory that"s used by only your app by calling and passing it a name indicating the type of directory you"d like. Each directory created this way is added to a parent directory that encapsulates all your app"s external storage files, which the system deletes when the user uninstalls your app.

Caution: Files on external storage are not always accessible , because users can mount the external storage to a computer for use as a storage device. So if you need to store files that are critical to your app"s functionality, you should instead store them on .

For example, here"s a method you can use to create a directory for an individual photo album:

Kotlin fun getPrivateAlbumStorageDir(context: Context, albumName: String): File? { // Get the directory for the app"s private pictures directory. val file = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), albumName) if (!file?.mkdirs()) { Log.e(LOG_TAG, "Directory not created") } return file } Java public File getPrivateAlbumStorageDir(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; }

If none of the pre-defined sub-directory names suit your files, you can instead call and pass null . This returns the root directory for your app"s private directory on the external storage.

Kotlin myFile.delete() Java myFile.delete();

If the file is saved on internal storage, you can also ask the to locate and delete a file by calling :

Kotlin myContext.deleteFile(fileName) Java myContext.deleteFile(fileName);

Note: When the user uninstalls your app, the Android system deletes the following:

  • All files you saved on internal storage.
  • All files you saved external storage using .

However, you should manually delete all cached files created with on a regular basis and also regularly delete other files you no longer need.

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 не дает никаких гарантий в отношении материалов, представленных на таких веб-сайтах, не подтверждает их и не берет на себя никакой ответственности за них или за пользование упомянутыми веб-сайтами.