Разработка 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, в котором есть код для проверки наличия внешнего хранилища и возможности его записи. Надеюсь, это поможет вам.

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