我遇到了一个问题。我的Galaxy Tab带有16GB的内部存储和2GB的SD卡。
当我使用environment.getExternalStorageState时,它返回已挂载。然而,当我从Galaxy Tab中取出SD卡时,它仍然返回已挂载,因为它将内部存储视为外部存储。有没有办法区分真正的SD卡和内部存储?
谢谢
目前似乎没有任何公共API可用。您可以通过查看/proc/mounts
来检查,但是您的代码将会与设备有关,因为并不是所有设备都在相同的位置挂载辅助外部存储(SD卡)。
我创建了一个自己的检查,它可以工作。它检查次要的、真实的SD卡是否存在。 在三星Galaxy s5 neo、Alcatel one touch 5020x和HTC One X上进行了测试。 由于它使用应用程序默认目录进行检查,所以该代码应该适用于KITKAT设备。
我创建了一个默认应用程序路径存储的字符串,然后将“primary”更改为“secondary”,然后尝试创建一个文件夹并检查其是否存在。
以下是代码:
String primaryStorage = Environment.getExternalStorageDirectory().getAbsolutePath();
String secondaryStorage = System.getenv("SECONDARY_STORAGE");
Boolean hasSecondary = false;
String internalSD = getExternalFilesDir(null) + "/test";
String externalSD = internalSD.replace(primaryStorage, secondaryStorage);
try{
File dir = new File(externalSD);
dir.mkdirs();
if (dir.isDirectory()) {
dir.delete();
hasSecondary = true;
}
} catch (Exception e) {
}
我认为/storage/sdcard0/
用于内部SD卡,而/storage/sdcard1/
用于外部SD卡,如果有两个存储选项。
如果您要检查文件是否存在于任何一个SD卡中,您应该检查所有可能的路径。
String path;
if(new File("/mnt/sdcard/yourpath").exists()) {
path="/storage/sdcard/yourpath";
} else if(new File("/storage/sdcard0/yourpath").exists()) {
path="/storage/sdcard0/yourpath";
} else if(new File("/storage/sdcard1/yourpath").exists()) {
path="/storage/sdcard1/yourpath";
}
我尝试像这样
if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
{
Log.i("tag", "SDCard is mounted");
}
或者这个例子可以帮助你
cat
命令查看其中的内容。 - Nikolay Elenkov