我怎样才能正确地获取外部SD卡路径?(How can I properly obtain the e

2019-07-04 00:24发布

我面临着获取安装在一些Android设备的外置SD卡的路径的众所周知的问题。 (见这个问题的理解我的意思)

我认为通过阅读的内容来解决问题/etc/vold.fstab ,然后以刚表示分区线,但我没有做测试的设备。 我想要做的是读取该文件,忽略它是指通过返回的地址行Environment.getExternalStorageDirectory()并采取其它行(如果存在的话)。

我不知道(我没有测试它的可能性)是:有没有在这我可以有其他的线,是不是外置SD卡的情况下? SD卡,如果存在的话,出现在文件vold.fstab?

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

Answer 1:

有什么不对这个 ?

Environment.getExternalStoreDirectory()

你为什么要无视这个时候它的SD卡?

OK - 与/ SD卡(内部)和外部SD卡(??),你总是可以扫描fstab文件并查找“sdhci”,这是SD主机控制器桥驱动装置的情况。

就像是:

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

然后,只需分析是必要的。

为什么“必要性”来,虽然找到实际的SD卡时,它实际上不是这样由OS处理? (不会被安装为大容量存储)

仅适用于设备如果是这种情况下,你的应用程序? 什么是错的使用任何Android的认为是SD存储空间?



Answer 2:

我用下面的代码首先检测羯羊的SD卡存在,然后运行该培训相关的代码:

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/..."
}

认为这是你所追求的?



Answer 3:

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

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;
}


文章来源: How can I properly obtain the external SD card path?