如何区分android中的内部和外部SD卡路径

时间:2013-05-22 10:04:18

标签: android sd-card

在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();
}

以上代码在一些最新的Android手机中失败了。请帮助我们。

以下是我们尝试过的详细信息:

  • 在拥有ICS和JellyBean操作系统的Android手机中,可移动SD卡的确切路径因设备制造商而异。

见下表

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。

  • 此外,对于上述设备,API Environment.isExternalStorageRemovable()始终返回false,无论是否存在可移动SD卡。

我们在谷歌搜索并尝试了他们给出的一些功能。它只提供了安装到设备的存储路径列表。但它并不表示是否存在删除标识卡。

我尝试获取存储路径的功能:

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

1 个答案:

答案 0 :(得分: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 );