如何正确获取外部SD卡路径?

时间:2012-11-20 15:33:09

标签: android storage external sd-card

我遇到了一个众所周知的问题,即获取安装在某些Android设备上的外部SD卡的路径。 (请参阅this question了解我的意思)

我想通过阅读/etc/vold.fstab的内容来解决问题,然后只使用代表分区的行,但我没有用于进行测试的设备。 我想要做的是读取该文件,忽略引用Environment.getExternalStorageDirectory()返回的地址的行,并取另一行(如果存在)。

我不知道(我没有可能测试它)是:有哪些情况下我可以有其他线路不是外部SD卡? SD卡(如果有)出现在文件vold.fstab?

修改: 答案是:是的。阅读accepted answer

3 个答案:

答案 0 :(得分:1)

this有什么问题?

Environment.getExternalStoreDirectory()

为什么你在SD卡上忽略了它?

确定 - 如果设备带有/ sdcard(内部)和外部SD卡(??),您可以随时扫描fstab文件并查找“sdhci”,它是SD主控制器桥接驱动程序。

类似的东西:

dev_mount sdcard /mnt/external_sdcard auto /devices/platform/sdhci.2/mmc_host/mmc2

然后根据需要进行解析。

为什么找到实际SD卡的“必要性”虽然它实际上并没有被操作系统这样对待? (不会作为大容量存储装载)

您的应用程序仅适用于存在此类情况的设备吗?使用Android认为的SD存储空间有什么问题?

答案 1 :(得分:0)

我使用以下代码首先检测sdCard是否存在,然后运行相关代码:

Detecting whether SD card exists:

Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
if(isSDPresent)
{
    // file path = "/mnt/sdcard/Android/data/PACKAGE_NAME/..."
}
else
{
    // file path = "/data/data/PACKAGE_NAME/..."
}

认为这就是你追求的目标?

答案 2 :(得分:-1)

这可能是正确的解决方案。从/etc/vold.fstab中读取它,它列出了当前在Linux系统上安装的所有分区(包括Android)

String getExternalSdcardDirectory() {
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(new File("/etc/vold.fstab"));
    } catch (FileNotFoundException e) {
        return null;    // should never be reached
    }

    try {
        byte[] buffer = new byte[4096];
        int n=0;

        String file = "";
        while ((n=fis.read(buffer, 0, 4096))>0) {
            file += new String(buffer, 0, n);
        }
        fis.close();

        String[] rows = file.split("\n");
        for (String row: rows) {
            String trimmedRow = row.trim();
            if (trimmedRow.startsWith("#") || trimmedRow.equals(""))
                continue;
            else if (trimmedRow.equals(Environment.getExternalStorageDirectory().getAbsolutePath()))
                continue;
            else
                return trimmedRow.split(" ")[2];

        }
    } catch (IOException e) {
        // nothing
    }
    return null;
}