Как бороться с более чем одним слотом для SD-карт - PullRequest
1 голос
/ 21 июля 2011

В моем приложении я сохраняю данные приложения пользователя, используя базы данных MySQLite, и разрешаю пользователю выполнять резервное копирование данных приложения на SD-карту в папке, которую я создаю на SD-карте (назовем это MyAppFolder).На устройствах Android, имеющих только один слот для SD-карты, все работает нормально (например, мой Droid).

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

В моем приложении я проверяю и проверяю, есть ли MyAppFolder ужесуществует.Если нет, я создаю эту папку.Папка всегда создается успешно, хотя она создается в «внутреннем» слоте памяти, возвращаемом функцией getExternalStorageDirectory (), когда присутствуют 2 слота.Однако файлы не создаются и не копируются туда.Я не понимаю, почему создается папка, но файлы не создаются.

Может кто-нибудь сказать мне, как я могу изменить этот код для работы с устройствами с 2 слотами для карт и 1 слотом для карт?Я бы предпочел не жестко кодировать местоположения для проверки, но если это единственный способ, я сделаю это только для того, чтобы все заработало.

Вот код, который я использую (немного измененный, чтобы сделать его более читабельным):

File root = Environment.getExternalStorageDirectory();
String state = Environment.getExternalStorageState();
if( Environment.MEDIA_MOUNTED.equals(state))
{
    File dataDirectory = Environment.getDataDirectory();
    if (root.canWrite())
    {
        String savePath = root + "/MyAppFolder/";
        File directory = new File(savePath);
        if( !directory.exists() )
        {
            directory.mkdirs();  //folder created successfully
        }

        String currentDBPath = "\\data\\my_app\\databases\\database.db";

        File currentDB = new File(datDirectory, currentDBPath);
        File backupDB = new File(savePath, "database.db");

        if (currentDB.exists()) 
        {
            FileChannel src = new FileInputStream(currentDB[i]).getChannel();
            FileChannel dst = new FileOutputStream(backupDB[i]).getChannel();

            dst.transferFrom(src, 0, src.size());

            src.close();
            dst.close();
        }
    }

1 Ответ

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

Может кто-нибудь сказать мне, как я могу изменить этот код для работы для устройств с 2 слотами для карт и 1 слотом для карт?

«Внешнее хранилище» не означает «съемное хранилище». «Внешнее хранилище» означает «монтируемое хранилище» - IOW, пользователь имеет доступ к этому хранилищу, когда он подключает свое устройство к хост-машине через кабель USB.

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

Может кто-нибудь сказать мне, как я могу изменить этот код для работы для устройств с 2 слотами для карт, а также 1 слотом для карт?

Используйте getDatabasePath(), чтобы получить путь к базе данных, а не циркуляции, через которые вы проходите в настоящее время. Никогда не используйте конкатенацию для создания путей, как в случае с root + "/MyAppFolder/" - используйте конструктор File, как и везде. Убедитесь, что у вас есть разрешение WRITE_EXTERNAL_STORAGE. Кроме того, это должно работать нормально для любого устройства с достаточным объемом внешней памяти для хранения вашей базы данных, независимо от того, сколько «слотов для карт» может иметь устройство.

...