我遇到了一个众所周知的问题,即获取安装在某些Android设备上的外部SD卡的路径。 (请参阅this question了解我的意思)
我想通过阅读/etc/vold.fstab
的内容来解决问题,然后只使用代表分区的行,但我没有用于进行测试的设备。
我想要做的是读取该文件,忽略引用Environment.getExternalStorageDirectory()
返回的地址的行,并取另一行(如果存在)。
我不知道(我没有可能测试它)是:有哪些情况下我可以有其他线路不是外部SD卡? SD卡(如果有)出现在文件vold.fstab?
上修改: 答案是:是的。阅读accepted answer。
答案 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;
}