在我的应用程序中,我使用MySQLite数据库存储用户的应用程序数据,并允许用户将应用程序数据备份到我在SD卡上创建的文件夹中的SD卡(我们称之为MyAppFolder)。在只有一个SD卡插槽的Android设备上,一切正常(例如我的Droid)。
然而,在拥有超过1张SD卡的Galaxy S等设备上,事情不起作用。不幸的是,我实际上没有这些设备之一,所以我无法调试任何东西,我只能通过用户报告。我也做了一些搜索,发现这是一个已知的问题。但是,我没有发现任何解决方案只涉及硬编码其他使用的路径,所以我正在寻找一些帮助。
在我的应用中,我检查并查看MyAppFolder是否已存在。如果没有,我创建该文件夹。该文件夹始终成功创建,但是当存在2个插槽时,它是在getExternalStorageDirectory()返回的“内部”内存插槽上创建的。但是,不会在那里创建和复制文件。我不明白为什么创建文件夹,但是没有创建文件。
有人可以告诉我如何修改此代码以适用于具有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();
}
}
答案 0 :(得分:0)
有人可以告诉我如何修改此代码以适用于具有2个卡位和1个卡位的设备吗?
“外部存储”并不意味着“可移动存储”。 “外部存储”意味着“可安装存储” - IOW,当用户通过USB电缆将设备插入主机时,用户可以访问该存储。
目前,Android旨在允许开发人员将内容写入一个外部存储点,并且由设备制造商决定是固定闪存还是可移动的东西。因此,您应该将内容备份到外部存储,而不是认为您支持SD卡。
有人可以告诉我如何修改此代码以适用于具有2个卡位和1个卡位的设备吗?
使用getDatabasePath()
获取数据库路径,而不是您目前正在经历的旋转。永远不要使用连接来创建路径,就像root + "/MyAppFolder/"
一样 - 使用File
构造函数,就像在其他地方一样。确保您持有WRITE_EXTERNAL_STORAGE
权限。除此之外,对于任何具有足够外部存储空间的设备来说,无论设备有多少“卡槽”,这都应该可以正常工作。