最近,我需要能够在手机的外部可移动存储(又名 SDCard)上严格写入一些数据。对于没有“外部”内部存储的低端设备(你知道我的意思),这不是问题,因为
Environment.getExternalStorageDirectory().getAbsolutePath()
,
返回
/mnt/sdcard
也是sdcard的路径。然而,在具有内置闪存存储(例如 sgs 2)的高端手机上,/mnt/sdcard
从 中返回Environment.getExternalStorageDirectory().getAbsolutePath()
的 只是通往内部存储的路径。sdcard的真实路径是`
/mnt/sdcard/external_sd`。
然而,这并不止于此,因为当我尝试使用升级到 ICS 的 sgs2 时,现在 sd 卡的路径是
/mnt/emmc
.
现在我正在尝试构建一个名为 ExternalStorage 的通用实用程序类,它具有一个静态方法,该方法返回到 sdcard 根目录的路径(以及一些其他方法来获取总空间、可用空间、特定目录消耗的空间等.) 到目前为止,我所拥有的是:
更新后的版本:
public static String getRemovableStoragePath() {
File f = null;
// Log.d(TAG, "Build.DEVICE: " + Build.DEVICE);
// Log.d(TAG, "Build.MANUFACTURER: " + Build.MANUFACTURER);
// Log.d(TAG, "Build.MODEL: " + Build.MODEL);
if (Build.VERSION.RELEASE.startsWith("4")) {
f = new File("/mnt/emmc");
}
if (Build.MODEL.toLowerCase().startsWith("mele")) {
return "/mnt/extern_sd0";
}
if (Build.DEVICE.equals("nuclear-zoop") || Build.DEVICE.equals("nuclear-f900")) {
f = new File("/mnt/extsd");
}
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
String extendedPath = "";
if (Build.DEVICE.toLowerCase().contains("samsung") || Build.MANUFACTURER.toLowerCase().contains("samsung")) {
extendedPath = "/external_sd/";
try {
f = new File(path + extendedPath);
if (f.exists() && f.isDirectory()) {
return f.getAbsolutePath();
} else if (Build.MODEL.toLowerCase().contains("gt-i9300")) {
extendedPath = "/mnt/extSdCard/";
try {
f = new File(extendedPath);
if (f.exists() && f.isDirectory()) {
return f.getAbsolutePath();
}
} catch (Exception e) {
// continue execution
}
} else {
extendedPath = "/sd";
}
} catch (Exception e) {
// contine execution
}
} else if (Build.DEVICE.toLowerCase().contains("e0") || Build.MANUFACTURER.toLowerCase().contains("LGE")) {
extendedPath = "/_ExternalSD/";
} else if (Build.MANUFACTURER.toLowerCase().contains("motorola") || Build.DEVICE.toLowerCase().contains("olympus")) {
f = new File("/mnt/sdcard-ext");
}
try {
if (!extendedPath.equals("")) {
f = new File(path + extendedPath);
}
if (f.exists() && f.isDirectory()) {
// Log.d(TAG, "path: " + f.getAbsolutePath());
return f.getAbsolutePath();
} else {
}
} catch (Exception e) {
// e.printStackTrace();
// f is probably null. no need to print stacktrace.
return path;
}
return path;
// return Environment.getExternalStorageDirectory().getAbsolutePath();
}
有人已经这样做了吗?我知道我缺少许多特定于制造商的路径,因此我需要帮助来完成此实用程序以支持尽可能多的 Android 手机。