External SDCard file path for Android External SDCard file path for Android android android

External SDCard file path for Android


Is it true that the file path to external SDCard on Android devices are always "/storage/extSdCard"? If not, how many variations are there?

Sadly the path to the external storage is not always the same according to manufacturer. Using Environment.getExternalStorageDirectory() will return you the normal path for SD card which is mnt/sdcard/. But for Samsung devices for example, the SD card path is either under mnt/extSdCard/ or under mnt/external_sd/.

So one way to proceed would be to check the existence of external directory according to the path used by each manufacturer. With something like this:

mExternalDirectory = Environment.getExternalStorageDirectory()            .getAbsolutePath();    if (android.os.Build.DEVICE.contains("samsung")            || android.os.Build.MANUFACTURER.contains("samsung")) {        File f = new File(Environment.getExternalStorageDirectory()                .getParent() + "/extSdCard" + "/myDirectory");        if (f.exists() && f.isDirectory()) {            mExternalDirectory = Environment.getExternalStorageDirectory()                    .getParent() + "/extSdCard";        } else {            f = new File(Environment.getExternalStorageDirectory()                    .getAbsolutePath() + "/external_sd" + "/myDirectory");              if (f.exists() && f.isDirectory()) {                mExternalDirectory = Environment                        .getExternalStorageDirectory().getAbsolutePath()                        + "/external_sd";            }        }    }

But what I really want is detect whether physical SDCard is mounted or not.

I didn't try the code yet, but the approach of Dmitriy Lozenko in this answer is much more interesting. His method returns the path of all mounted SD cards on sytem regardless of the manufacturer.


This is how I finally got sdcard path using :

public String getExternalStoragePath() {        String internalPath = Environment.getExternalStorageDirectory().getAbsolutePath();        String[] paths = internalPath.split("/");        String parentPath = "/";        for (String s : paths) {            if (s.trim().length() > 0) {                parentPath = parentPath.concat(s);                break;            }        }        File parent = new File(parentPath);        if (parent.exists()) {            File[] files = parent.listFiles();            for (File file : files) {                String filePath = file.getAbsolutePath();                Log.d(TAG, filePath);                if (filePath.equals(internalPath)) {                    continue;                } else if (filePath.toLowerCase().contains("sdcard")) {                    return filePath;                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {                    try {                        if (Environment.isExternalStorageRemovable(file)) {                            return filePath;                        }                    } catch (RuntimeException e) {                        Log.e(TAG, "RuntimeException: " + e);                    }                }            }        }        return null;    }


I hope it will be useful for you :)

import android.os.Environment;import java.io.File;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Scanner;public class MemoryStorage {    private MemoryStorage() {}    public static final String SD_CARD = "sdCard";    public static final String EXTERNAL_SD_CARD = "externalSdCard";    /**     * @return True if the external storage is available. False otherwise.     */    public static boolean isAvailable() {        String state = Environment.getExternalStorageState();        if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {            return true;        }        return false;    }    public static String getSdCardPath() {        return Environment.getExternalStorageDirectory().getPath() + "/";    }    /**     * @return True if the external storage is writable. False otherwise.     */    public static boolean isWritable() {        String state = Environment.getExternalStorageState();        if (Environment.MEDIA_MOUNTED.equals(state)) {            return true;        }        return false;    }    /**     * @return A map of all storage locations available     */    public static Map<String, File> getAllStorageLocations() {        Map<String, File> map = new HashMap<String, File>(10);        List<String> mMounts = new ArrayList<String>(10);        List<String> mVold = new ArrayList<String>(10);        mMounts.add("/mnt/sdcard");        mVold.add("/mnt/sdcard");        try {            File mountFile = new File("/proc/mounts");            if (mountFile.exists()) {                Scanner scanner = new Scanner(mountFile);                while (scanner.hasNext()) {                    String line = scanner.nextLine();                    if (line.startsWith("/dev/block/vold/")) {                        String[] lineElements = line.split(" ");                        String element = lineElements[1];                        // don't add the default mount path                        // it's already in the list.                        if (!element.equals("/mnt/sdcard"))                            mMounts.add(element);                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }        try {            File voldFile = new File("/system/etc/vold.fstab");            if (voldFile.exists()) {                Scanner scanner = new Scanner(voldFile);                while (scanner.hasNext()) {                    String line = scanner.nextLine();                    if (line.startsWith("dev_mount")) {                        String[] lineElements = line.split(" ");                        String element = lineElements[2];                        if (element.contains(":"))                            element = element.substring(0, element.indexOf(":"));                        if (!element.equals("/mnt/sdcard"))                            mVold.add(element);                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }        for (int i = 0; i < mMounts.size(); i++) {            String mount = mMounts.get(i);            if (!mVold.contains(mount))                mMounts.remove(i--);        }        mVold.clear();        List<String> mountHash = new ArrayList<String>(10);        for (String mount : mMounts) {            File root = new File(mount);            if (root.exists() && root.isDirectory() && root.canWrite()) {                File[] list = root.listFiles();                String hash = "[";                if (list != null) {                    for (File f : list) {                        hash += f.getName().hashCode() + ":" + f.length() + ", ";                    }                }                hash += "]";                if (!mountHash.contains(hash)) {                    String key = SD_CARD + "_" + map.size();                    if (map.size() == 0) {                        key = SD_CARD;                    } else if (map.size() == 1) {                        key = EXTERNAL_SD_CARD;                    }                    mountHash.add(hash);                    map.put(key, root);                }            }        }        mMounts.clear();        if (map.isEmpty()) {            map.put(SD_CARD, Environment.getExternalStorageDirectory());        }        return map;    }}