[英]Get all storage paths in Android
I have tried almost all solutions to get list of storage paths including How can I get external SD card path for Android 4.0+? 我已经尝试了几乎所有解决方案来获取存储路径列表,包括如何获取Android 4.0+的外部SD卡路径? .
。 But nothing returns the removable sd card path.
但是没有任何东西返回可移动sd卡路径。
And finally I tried with "/mnt/"
. 最后,我尝试使用
"/mnt/"
。 This returns all storage paths including some other paths also. 这将返回所有存储路径,包括一些其他路径。 But I want only storage paths.
但是我只想要存储路径。 How could I achieve this?.
我怎么能做到这一点? Is there any way to detect whether the given path is storage path, or is there any better way to get all storage paths in
Android
. 有没有办法检测给定的路径是存储路径,还是有更好的方法来获取
Android
所有存储路径。
You can use this class for getting all available storage on Android Phone. 您可以使用此类来获取Android Phone上的所有可用存储空间。 This code is taken from stackoverflow.com but contains some error.
该代码取自stackoverflow.com,但包含一些错误。 I remove the error and this code tested in Android 6 and Android 7.
我移除了错误,并在Android 6和Android 7中测试了此代码。
public class StorageUtils {
private static final String TAG = "StorageUtils";
public static class StorageInfo {
public final String path;
public final boolean readonly;
public final boolean removable;
public final int number;
StorageInfo(String path, boolean readonly, boolean removable, int number) {
this.path = path;
this.readonly = readonly;
this.removable = removable;
this.number = number;
}
public String getDisplayName() {
StringBuilder res = new StringBuilder();
if (!removable) {
res.append("Internal Storage");
} else if (number > 1) {
res.append("SD card " + number);
} else {
res.append("SD card");
}
if (readonly) {
res.append(" (Read only)");
}
return res.toString();
}
}
public static List<StorageInfo> getStorageList() {
List<StorageInfo> list = new ArrayList<StorageInfo>();
String def_path = Environment.getExternalStorageDirectory().getPath();
boolean def_path_removable = 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);
HashSet<String> paths = new HashSet<String>();
int cur_removable_number = 1;
if (def_path_available) {
paths.add(def_path);
list.add(0, new StorageInfo(def_path, def_path_readonly, def_path_removable, def_path_removable ? cur_removable_number++ : -1));
}
BufferedReader buf_reader = null;
try {
buf_reader = new BufferedReader(new FileReader("/proc/mounts"));
String line;
while ((line = buf_reader.readLine()) != null) {
if (line.contains("vfat") || line.contains("/mnt") || line.contains("sdcardfs")) {
Log.d(TAG, line);
StringTokenizer tokens = new StringTokenizer(line, " ");
String mPath = tokens.nextToken(); //device
String mount_point = tokens.nextToken(); //mount point
if (paths.contains(mount_point)) {
continue;
}
String unused = tokens.nextToken(); //file system
List<String> flags = Arrays.asList(tokens.nextToken().split(",")); //flags
boolean readonly = flags.contains("ro");
if (!line.contains("/mnt/secure")
&& !line.contains("/mnt/asec")
&& !line.contains("/mnt/obb")
&& !line.contains("/dev/mapper")
&& !line.contains("tmpfs")) {
File testFile = new File(mount_point);
if(testFile.isDirectory() && testFile.listFiles() != null) {
paths.add(mount_point);
list.add(new StorageInfo(mount_point, readonly, true, cur_removable_number++));
}
}
}
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (buf_reader != null) {
try {
buf_reader.close();
} catch (IOException ex) {}
}
}
return list;
}
}
Hope this help. 希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.