Разработка Android - тест для SD-карты или его там?
Для сохранения пользовательских данных для моего приложения потребуется внешнее хранилище (SD-карта). Я искал высоко и низко, но я не могу найти для этого лучших практик.
Я...
-
Просто предположим, что внешнее хранилище будет присутствовать и пропустить добавление проверок и предупреждений? (Предполагалось, что в редких случаях будет отсутствовать внешнее хранилище, и не стоит тратить много времени на кодирование решения для этого. Типичные пользователи никогда не удаляют свои SD-карты и т.д.)
-
Убедитесь, что внешнее хранилище установлено только при чтении или записи на него? (Пользователи могут удалить свою SD-карту в любое время, но приложение все равно будет работать, пока не придет время для доступа к их данным.)
-
Добавить прослушиватель на уровне приложения, ожидающего уведомления внешнего хранилища, и отображает модальное оповещение по всему периметру приложения? (Это звучит идеально, но также может быть излишним для всего, что я знаю.)
Любое понимание будет оценено.
Ответы
Ответ 1
Вы должны обязательно проверить его перед использованием. Я бы предложил №2; вы правы, # 3 действительно кажется излишним (я даже не знаю, есть ли для этого слушатель). В в документах Google есть следующее:
Прежде чем выполнять какую-либо работу с внешним хранилищем, вы всегда должны вызвать getExternalStorageState(), чтобы проверить, доступен ли носитель. Средства массовой информации могут быть установлены на компьютер, отсутствуют, доступны только для чтения или в каком-либо другом состоянии.
Ответ 2
Да, вам нужно проверить наличие SD-карты, чтобы вам помогла следующая функция.
private boolean checkForDirectory()
{
boolean cardstate = true;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_BAD_REMOVAL.equals(state)) {
cardstate = false;
runDialog("Memory Card was removed before it was unmounted");
}
else if (Environment.MEDIA_CHECKING.equals(state)) {
runDialog("Memory Card is present and being disk-checked");
}
else if (Environment.MEDIA_MOUNTED.equals(state)) {
cardstate = true;
//runDialog("Memory Card is present and mounted with read/write access");
}
else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
runDialog("Memory Card is present and mounted with readonly access");
}
else if (Environment.MEDIA_NOFS.equals(state)) {
cardstate = false;
runDialog("Memory Card is present but is blank or using unsupported file system");
}
else if (Environment.MEDIA_REMOVED.equals(state)) {
cardstate = false;
runDialog("Memory Card is not present");
}
else if (Environment.MEDIA_SHARED.equals(state)) {
cardstate = false;
runDialog("Memory Card is present but shared via USB mass storage");
}
else if (Environment.MEDIA_UNMOUNTABLE.equals(state)) {
cardstate = false;
runDialog("Memory Card is present but cannot be mounted");
}
else if (Environment.MEDIA_UNMOUNTED.equals(state)) {
cardstate = false;
runDialog("Memory Card is present but not mounted");
}
File dir = new File(Environment.getExternalStorageDirectory() + "/gwc");
if(dir.exists() && dir.isDirectory())
{
System.out.println("Folder exists");
}
else
{
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
File myNewFolder = new File(extStorageDirectory + "/gwc");
myNewFolder.mkdir();
System.out.println("Folder gwc created ");
}
return cardstate;
}
Ответ 3
Абсолютно согласен с ответом Shawn Lauzon, и вот сообщение на developer.android.com, в котором есть код для проверки наличия внешнего хранилища и возможности его записи. Надеюсь, это поможет вам.
Хранилище данных