8

在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中的存储路径列表?也有助于解决上述问题。

4

1 回答 1

2

获取内部 SD 卡

String internalStorage = System.getenv("EXTERNAL_STORAGE");
File f_exts = new File(internalStorage );

获取外部 SD 卡

String externalStorage = System.getenv("SECONDARY_STORAGE");
File f_secs = new File(externalStorage );
于 2014-08-18T05:20:39.097 回答