How can I get the external SD card path for Android 4.0+?

前端 未结 26 2689
清歌不尽
清歌不尽 2020-11-22 04:48

Samsung Galaxy S3 has an external SD card slot, which is mounted to /mnt/extSdCard.

How can I get this path by something like Environment.getExter

相关标签:
26条回答
  • 2020-11-22 05:42

    refer to my code, hope helpful for you:

        Runtime runtime = Runtime.getRuntime();
        Process proc = runtime.exec("mount");
        InputStream is = proc.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        String line;
        String mount = new String();
        BufferedReader br = new BufferedReader(isr);
        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 = mount.concat("*" + columns[1] + "\n");
                }
            } else if (line.contains("fuse")) {//internal storage
                String columns[] = line.split(" ");
                if (columns != null && columns.length > 1) {
                    mount = mount.concat(columns[1] + "\n");
                }
            }
        }
        txtView.setText(mount);
    
    0 讨论(0)
  • 2020-11-22 05:42

    The following steps worked for me. You just need to write this lines:

    String sdf = new String(Environment.getExternalStorageDirectory().getName());
    String sddir = new String(Environment.getExternalStorageDirectory().getPath().replace(sdf,""));
    

    The first line will give the name of sd directory, and you just need to use it in the replace method for the second string. The second string will contain the path for the internal and removable sd(/storage/ in my case). I just needed this path for my app but you can go further if you need it.

    0 讨论(0)
  • 2020-11-22 05:43

    I have a variation on a solution I found here

    public static HashSet<String> getExternalMounts() {
        final HashSet<String> out = new HashSet<String>();
        String reg = "(?i).*vold.*(vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*";
        String s = "";
        try {
            final Process process = new ProcessBuilder().command("mount")
                    .redirectErrorStream(true).start();
            process.waitFor();
            final InputStream is = process.getInputStream();
            final byte[] buffer = new byte[1024];
            while (is.read(buffer) != -1) {
                s = s + new String(buffer);
            }
            is.close();
        } catch (final Exception e) {
            e.printStackTrace();
        }
    
        // parse output
        final String[] lines = s.split("\n");
        for (String line : lines) {
            if (!line.toLowerCase(Locale.US).contains("asec")) {
                if (line.matches(reg)) {
                    String[] parts = line.split(" ");
                    for (String part : parts) {
                        if (part.startsWith("/"))
                            if (!part.toLowerCase(Locale.US).contains("vold"))
                                out.add(part);
                    }
                }
            }
        }
        return out;
    }
    

    The original method was tested and worked with

    • Huawei X3 (stock)
    • Galaxy S2 (stock)
    • Galaxy S3 (stock)

    I'm not certain which android version these were on when they were tested.

    I've tested my modified version with

    • Moto Xoom 4.1.2 (stock)
    • Galaxy Nexus (cyanogenmod 10) using an otg cable
    • HTC Incredible (cyanogenmod 7.2) this returned both the internal and external. This device is kinda an oddball in that its internal largely goes unused as getExternalStorage() returns a path to the sdcard instead.

    and some single storage devices that use an sdcard as their main storage

    • HTC G1 (cyanogenmod 6.1)
    • HTC G1 (stock)
    • HTC Vision/G2 (stock)

    Excepting the Incredible all these devices only returned their removable storage. There are probably some extra checks I should be doing, but this is at least a bit better than any solution I've found thus far.

    0 讨论(0)
  • 2020-11-22 05:43
    String secStore = System.getenv("SECONDARY_STORAGE");
    
    File externalsdpath = new File(secStore);
    

    This will get the path of external sd secondary storage.

    0 讨论(0)
  • 2020-11-22 05:44
           File[] files = null;
        File file = new File("/storage");// /storage/emulated
    if (file.exists()) {
            files = file.listFiles();
                }
                if (null != files)
                    for (int j = 0; j < files.length; j++) {
                        Log.e(TAG, "" + files[j]);
                        Log.e(TAG, "//--//--// " +             files[j].exists());
    
                        if (files[j].toString().replaceAll("_", "")
                                .toLowerCase().contains("extsdcard")) {
                            external_path = files[j].toString();
                            break;
                        } else if (files[j].toString().replaceAll("_", "")
                                .toLowerCase()
                                .contains("sdcard".concat(Integer.toString(j)))) {
                            // external_path = files[j].toString();
                        }
                        Log.e(TAG, "--///--///--  " + external_path);
                    }
    
    0 讨论(0)
  • 2020-11-22 05:45

    You can use something like - Context.getExternalCacheDirs() or Context.getExternalFilesDirs() or Context.getObbDirs(). They give application specific directories in all external storage devices where the application can store its files.

    So something like this - Context.getExternalCacheDirs()[i].getParentFile().getParentFile().getParentFile().getParent() can get you the root path of external storage devices.

    I know these commands are for a different purpose but other answers didn't work for me.

    This link gave me good pointers - https://possiblemobile.com/2014/03/android-external-storage/

    0 讨论(0)
提交回复
热议问题