如何处理多个SD卡插槽

时间:2011-07-21 03:35:21

标签: android android-sdcard

在我的应用程序中,我使用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();
        }
    }

1 个答案:

答案 0 :(得分:0)

  

有人可以告诉我如何修改此代码以适用于具有2个卡位和1个卡位的设备吗?

“外部存储”并不意味着“可移动存储”。 “外部存储”意味着“可安装存储” - IOW,当用户通过USB电缆将设备插入主机时,用户可以访问该存储。

目前,Android旨在允许开发人员将内容写入一个外部存储点,并且由设备制造商决定是固定闪存还是可移动的东西。因此,您应该将内容备份到外部存储,而不是认为您支持SD卡。

  

有人可以告诉我如何修改此代码以适用于具有2个卡位和1个卡位的设备吗?

使用getDatabasePath()获取数据库路径,而不是您目前正在经历的旋转。永远不要使用连接来创建路径,就像root + "/MyAppFolder/"一样 - 使用File构造函数,就像在其他地方一样。确保您持有WRITE_EXTERNAL_STORAGE权限。除此之外,对于任何具有足够外部存储空间的设备来说,无论设备有多少“卡槽”,这都应该可以正常工作。