0

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

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

我不知道(而且我没有可能对其进行测试)是:在某些情况下,我可以拥有不是外部 SD 卡的其他线路吗?SD 卡(如果存在)是否出现在文件 vold.fstab 中?

编辑:答案是:是的。阅读接受的答案

4

3 回答 3

1

这有什么问题

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 存储空间有什么问题?

于 2012-11-20T15:35:26.577 回答
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/..."
}

认为这就是你所追求的吗?

于 2012-11-20T16:04:45.420 回答
-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;
}
于 2015-03-16T11:48:46.377 回答