在Android中,我可以使用以下方法获取手机的可移动外部存储空间:
for (File f : context.getExternalFilesDirs("/"))
if (Environment.isExternalStorageRemovable(f))
Log.println(Log.DEBUG, "#", f.getAbsolutePath());
然而,这会返回/storage/8E6A-06FF/Android/data/test.application/files
这不是我想要的,因为我只想要可移动的根路径/storage/8E6A-06FF/
。我怎样才能获得手机可移动存储的根路径?
答案 0 :(得分:1)
你可以尝试一下它对我来说是完美的。它的作用就像是所有Os版本的魅力。到目前为止我没有发现任何问题这个功能。
public static String getSDPath() {
String filepath = "";
String[] strPath = {"/storage/sdcard1", "/storage/extsdcard",
"/storage/sdcard0/external_sdcard", "/mnt/extsdcard",
"/mnt/sdcard/external_sd", "/mnt/external_sd",
"/mnt/media_rw/sdcard1", "/removable/microsd", "/mnt/emmc",
"/storage/external_SD", "/storage/ext_sd",
"/storage/removable/sdcard1", "/data/sdext", "/data/sdext2",
"/data/sdext3", "/data/sdext4", "/emmc", "/sdcard/sd",
"/mnt/sdcard/bpemmctest", "/mnt/sdcard/_ExternalSD",
"/mnt/sdcard-ext", "/mnt/Removable/MicroSD",
"/Removable/MicroSD", "/mnt/external1", "/mnt/extSdCard",
"/mnt/extsd", "/mnt/usb_storage", "/mnt/extSdCard",
"/mnt/UsbDriveA", "/mnt/UsbDriveB"};
for (String value : strPath) {
File f = null;
f = new File(value);
if (f.exists() && f.isDirectory()) {
filepath = value;
break;
}
}
return filepath;
}
答案 1 :(得分:0)
试试这个:
for (File f : context.getExternalFilesDirs("/"))
if (Environment.isExternalStorageRemovable(f))
Log.println(Log.DEBUG, "#", f.getParentFile().getParentFile().getParentFile().getParent());
context.getExternalFilesDirs()将始终返回特定于应用程序的目录。但好处是特定于应用程序的目录总是距离存储设备的根文件夹4层深。因此,在File f而不是f.getAbsolutePath()上调用getParentFile()四次将获得手机可移动存储的根路径。
答案 2 :(得分:0)
也许只是在Android
上拆分它?
我对其进行了测试,并且在我request for permission-WRITE_EXTERNAL_STORAGE
之后可以正常工作。
fun getBaseDir(dir: File): String {
val absPath = dir.absolutePath
return if (absPath.contains("/Android")) {
absPath.split("/Android")[0]
} else {
absPath
}
}
答案 3 :(得分:0)
这将遍历sdcard根目录上的文件。如果要使用主存储,只需将[1]更改为[0]。 getExternalFilesDirs 返回主存储和辅助存储上您的应用程序目录的路径。用“ Android”分割第二条路径后,第一个字符串将包含辅助存储根目录的路径。例如在我的情况下是“ / storage / B242-37B2 /”。使用 minSdkVersion 19 + 。
String sdCardRoot = ContextCompat.getExternalFilesDirs(getApplicationContext(), null)[1].getAbsolutePath().split("Android")[0];
File f = new File(sdCardRoot);
File[] files = f.listFiles();
for (File inFile : files){
Log.d("Files", inFile.getName());
}
答案 4 :(得分:-1)
如果有帮助,请试试这个。有关更多信息,请参阅this link。
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;
}
这是另一种方法。来自here的来源。
Environment.getExternalStorageState()返回内部SD的路径 挂载点如&#34; / mnt / sdcard&#34;
但问题是关于外部SD。如何获得类似&#34; / mnt / sdcard / external_sd&#34;的路径(它可能因设备而异)?
除了外部存储之外,Android没有&#34;外部SD&#34;的概念,如上所述。如果设备制造商选择将外部存储设备作为板载闪存并且还具有SD卡,则需要与该制造商联系以确定是否可以使用SD卡(不保证)以及规则用于使用它,例如使用它的路径。