В моем приложении я сохраняю данные приложения пользователя, используя базы данных 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();
}
}