我面临着获取安装在一些Android设备的外置SD卡的路径的众所周知的问题。 (见这个问题的理解我的意思)
我认为通过阅读的内容来解决问题/etc/vold.fstab
,然后以刚表示分区线,但我没有做测试的设备。 我想要做的是读取该文件,忽略它是指通过返回的地址行Environment.getExternalStorageDirectory()
并采取其它行(如果存在的话)。
我不知道(我没有测试它的可能性)是:有没有在这我可以有其他的线,是不是外置SD卡的情况下? SD卡,如果存在的话,出现在文件vold.fstab?
编辑 :答案是:YES。 阅读接受的答案 。
有什么不对这个 ?
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存储空间?
我用下面的代码首先检测羯羊的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/..."
}
认为这是你所追求的?
这可能是正确的解决方案。 从/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;
}