Does Environment.getExternalStorageDirectory() returns a usable data folder when no sd card is mounted?

Seraphim's picture Seraphim's · Jul 11, 2013 · Viewed 11.8k times · Source

Imagine an Android device with no sd memory insterted. Only its own internal memory.

I'm not sure what Environment.getExternalStorageDirectory() returns in this case.

Null or a internal memory location valid for permanent data storage?

Answer

Raghunandan picture Raghunandan · Jul 11, 2013

public static File getExternalStorageDirectory()

Added in API level 1

Gets the Android external storage directory. This directory may not currently be accessible if it has been mounted by the user on their computer, has been removed from the device, or some other problem has happened. You can determine its current state with getExternalStorageState().

Note: don't be confused by the word "external" here. This directory can better be thought as media/shared storage. It is a filesystem that can hold a relatively large amount of data and that is shared across all applications (does not enforce permissions). Traditionally this is an SD card, but it may also be implemented as built-in storage in a device that is distinct from the protected internal storage and can be mounted as a filesystem on a computer.

I think differs from device to device.

I have a Samsung Galaxy S3 Environment.getExternalStorageDirectory() returns sdCard0 which is path of internal storage memory.

More info @

http://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory()

I will not recommend the below. I had a discussion on this with Commonsware and the advice was not to use the below. But you can use the below for testing purposes.

String externalpath = new String();
String internalpath = new String();
    
public void getExternalMounts() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process proc = runtime.exec("mount");
        InputStream is = proc.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        String line;
        
        BufferedReader br = new BufferedReader(isr);
        while ((line = br.readLine()) != null) {
            if (line.contains("secure")) continue;
            if (line.contains("asec")) continue;
        
            if (line.contains("fat")) {//external card
                String columns[] = line.split(" ");
                if (columns != null && columns.length > 1) {
                    externalpath = externalpath.concat("*" + columns[1] + "\n");
                }
            } 
            else if (line.contains("fuse")) {//internal storage
                String columns[] = line.split(" ");
                if (columns != null && columns.length > 1) {
                    internalpath = internalpath.concat(columns[1] + "\n");
                }
            }
        }
    }
    catch(Exception e) {
        e.printStackTrace();
    }
    System.out.println("Path  of sd card external............"+externalpath);
    System.out.println("Path  of internal memory............"+internalpath);
}