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

Pra*_*een 8 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
}             
Run Code Online (Sandbox Code Playgroud)

为此,我们使用以下代码:

If (Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)){
                String path= Environment.getExternalStorageDirectory().getPath();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在一些最新的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
Run Code Online (Sandbox Code Playgroud)

在这些设备中运行上述代码时,我们得到:

  • android API Environment.getExternalStorageDirectory().getPath()仅返回内部sd路径

  • 此外,即使删除了sdcard,API Environment.getExternalStorageState()也会在上述设备中返回Environment.MEDIA_MOUNTED.

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

我们在谷歌搜索并尝试了他们给出的一些功能.它只给出了安装到设备的存储路径列表.但它并不表示是否存在removale 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;
}
Run Code Online (Sandbox Code Playgroud)

有没有比上面更好的其他功能来获取android中的存储路径列表?也有助于解决上述问题.

Vai*_*iya 2

获取内部 SD 卡

String internalStorage = System.getenv("EXTERNAL_STORAGE");
File f_exts = new File(internalStorage );
Run Code Online (Sandbox Code Playgroud)

获取外部 SD 卡

String externalStorage = System.getenv("SECONDARY_STORAGE");
File f_secs = new File(externalStorage );
Run Code Online (Sandbox Code Playgroud)