Разработка Android - проверить SD-карту или предположить, что она есть? - PullRequest
2 голосов
/ 21 июля 2011

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

Должен ли я ...

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

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

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

Любое понимание будет высоко оценено.

Ответы [ 3 ]

3 голосов
/ 21 июля 2011

Да, вам нужно проверить наличие 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;
     }
2 голосов
/ 21 июля 2011

Вы обязательно должны проверить это перед использованием.Я хотел бы предложить № 2;Вы правы, № 3 кажется излишним (я даже не знаю, есть ли слушатель для этого). Google docs имеет следующее:

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

0 голосов
/ 21 июля 2011

Абсолютно согласен с ответом Шона Лозона, и вот пост на developer.android.com, в котором есть некоторый код для проверки доступности внешнего хранилища и возможности его записи.Надеюсь, это поможет вам.

Хранение данных

...