Find location of a removable SD card

前端 未结 22 2595
南方客
南方客 2020-11-21 11:32

Is there an universal way to find the location of an external SD card?

Please, do not be confused with External Storage.

Environment.getExternalStorage

22条回答
  •  太阳男子
    2020-11-21 11:59

    Like Richard I also use /proc/mounts file to get the list of available storage options

    public class StorageUtils {
    
        private static final String TAG = "StorageUtils";
    
        public static class StorageInfo {
    
            public final String path;
            public final boolean internal;
            public final boolean readonly;
            public final int display_number;
    
            StorageInfo(String path, boolean internal, boolean readonly, int display_number) {
                this.path = path;
                this.internal = internal;
                this.readonly = readonly;
                this.display_number = display_number;
            }
    
            public String getDisplayName() {
                StringBuilder res = new StringBuilder();
                if (internal) {
                    res.append("Internal SD card");
                } else if (display_number > 1) {
                    res.append("SD card " + display_number);
                } else {
                    res.append("SD card");
                }
                if (readonly) {
                    res.append(" (Read only)");
                }
                return res.toString();
            }
        }
    
        public static List getStorageList() {
    
            List list = new ArrayList();
            String def_path = Environment.getExternalStorageDirectory().getPath();
            boolean def_path_internal = !Environment.isExternalStorageRemovable();
            String def_path_state = Environment.getExternalStorageState();
            boolean def_path_available = def_path_state.equals(Environment.MEDIA_MOUNTED)
                                        || def_path_state.equals(Environment.MEDIA_MOUNTED_READ_ONLY);
            boolean def_path_readonly = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY);
            BufferedReader buf_reader = null;
            try {
                HashSet paths = new HashSet();
                buf_reader = new BufferedReader(new FileReader("/proc/mounts"));
                String line;
                int cur_display_number = 1;
                Log.d(TAG, "/proc/mounts");
                while ((line = buf_reader.readLine()) != null) {
                    Log.d(TAG, line);
                    if (line.contains("vfat") || line.contains("/mnt")) {
                        StringTokenizer tokens = new StringTokenizer(line, " ");
                        String unused = tokens.nextToken(); //device
                        String mount_point = tokens.nextToken(); //mount point
                        if (paths.contains(mount_point)) {
                            continue;
                        }
                        unused = tokens.nextToken(); //file system
                        List flags = Arrays.asList(tokens.nextToken().split(",")); //flags
                        boolean readonly = flags.contains("ro");
    
                        if (mount_point.equals(def_path)) {
                            paths.add(def_path);
                            list.add(0, new StorageInfo(def_path, def_path_internal, readonly, -1));
                        } else if (line.contains("/dev/block/vold")) {
                            if (!line.contains("/mnt/secure")
                                && !line.contains("/mnt/asec")
                                && !line.contains("/mnt/obb")
                                && !line.contains("/dev/mapper")
                                && !line.contains("tmpfs")) {
                                paths.add(mount_point);
                                list.add(new StorageInfo(mount_point, false, readonly, cur_display_number++));
                            }
                        }
                    }
                }
    
                if (!paths.contains(def_path) && def_path_available) {
                    list.add(0, new StorageInfo(def_path, def_path_internal, def_path_readonly, -1));
                }
    
            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                if (buf_reader != null) {
                    try {
                        buf_reader.close();
                    } catch (IOException ex) {}
                }
            }
            return list;
        }    
    }
    

提交回复
热议问题