在android应用程序中我需要做:
If(removable SdCard is present){
String path=get the path of removable Sdcard() ;
//using this path we will create some files in sdcard
} else{
//display error message
}
为此,我们使用以下代码:
If (Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)){
String path= Environment.getExternalStorageDirectory().getPath();
}
上面的代码在一些最新的安卓手机中失败了。请帮助我们。
以下是我们尝试过的详细信息:
- 在具有 ICS 和 JellyBean 操作系统的 android 手机中,可移动 sdcard 的确切路径因设备制造商而异。
见下表
Tested Devices OS version removable sdcard path internal sd path
Samsung galaxy s2 4.0.4 /mnt/sdcard/external_sd /mnt/sdcard
Samsung S Advance 4.1.2 /storage/extSdCard /storage/sdcard0
Samsung Galaxy s3 4.0.4 /mnt/extSdCard /mnt/sdcard
Samsung Galaxy Note 4.0.4 /mnt/sdcard/external_sd /mnt/sdcard
在这些设备中运行上述代码时,我们得到:
android API Environment.getExternalStorageDirectory().getPath() 仅返回内部 sd 路径
即使删除了 sdcard,API Environment.getExternalStorageState() 也会在上述设备中返回 Environment.MEDIA_MOUNTED。
此外,无论是否存在可移动 SD 卡,API Environment.isExternalStorageRemovable() 始终为上述设备返回 false。
我们在 google 中搜索并尝试了他们提供的一些功能。它只提供了安装到设备的存储路径列表。但它不指示删除的 sdcard 是否存在。
我试图获取存储路径的功能:
private static String getMountedPaths(){
String sdcardPath = "";
Runtime runtime = Runtime.getRuntime();
Process proc = null;
try {
proc = runtime.exec("mount");
} catch (IOException e1) {
e1.printStackTrace();
}
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;
BufferedReader br = new BufferedReader(isr);
try {
while ((line = br.readLine()) != null) {
if (line.contains("secure")) continue;
if (line.contains("asec")) continue;
if (line.contains("fat")) {//TF card
String columns[] = line.split(" ");
if (columns != null && columns.length > 1) {
mount.add(columns[1]);
sdcardPath=columns[1];
}
} else if (line.contains("fuse")) {//internal storage
String columns[] = line.split(" ");
if (columns != null && columns.length > 1) {
mount.add(columns[1]);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return sdcardPath;
}
有没有比上面更好的函数来获取android中的存储路径列表?也有助于解决上述问题。