我一直在谷歌搜索,但很难找到制造商/型号使用哪种路径进行SD卡/外部存储。
Environment.getExternalStorageDirectory()
我知道getExternalStorageDirectory()
有时指向某些设备上的外部SD卡。
以下是我发现外部路径的一些常见路径(不确定哪个制造商使用哪条路径):
/emmc
/mnt/sdcard/external_sd
/mnt/external_sd
/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 <-- usb flash mount
/mnt/extSdCard <-- usb flash mount
/mnt/UsbDriveA <-- usb flash mount
/mnt/UsbDriveB <-- usb flash mount
这些是我通过谷歌搜索找到的。
我需要扫描整个内部+外部存储器+ USB闪存驱动器以查找某个文件。如果我遗漏了任何路径,请添加到上面的列表中。如果有人知道每个制造商使用的路径,请与我们分享。
答案 0 :(得分:12)
新的Context.getExternalFilesDirs()
和Context.getExternalCacheDirs()
方法可以返回多个路径,包括主设备和辅助设备。然后,您可以迭代它们并检查Environment.getStorageState()
和File.getFreeSpace()
以确定存储文件的最佳位置。这些方法也可以在support-v4库中的ContextCompat
上使用。
另请注意,如果您只对使用Context
返回的目录感兴趣,则不再需要READ_
或WRITE_EXTERNAL_STORAGE
权限。展望未来,您将始终拥有对这些目录的读/写权限,而无需其他权限。
应用还可以通过终止其权限请求继续使用旧设备:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
答案 1 :(得分:11)
我也从某个地方开始使用像你这样的列表(抱歉无法找到原始来源)并继续添加从用户反馈中收集的一些路径。上面的列表有重复。
/storage/sdcard1 //!< Motorola Xoom
/storage/extsdcard //!< Samsung SGS3
/storage/sdcard0/external_sdcard // user request
/mnt/extsdcard
/mnt/sdcard/external_sd //!< Samsung galaxy family
/mnt/external_sd
/mnt/media_rw/sdcard1 //!< 4.4.2 on CyanogenMod S3
/removable/microsd //!< Asus transformer prime
/mnt/emmc
/storage/external_SD //!< LG
/storage/ext_sd //!< HTC One Max
/storage/removable/sdcard1 //!< Sony Xperia Z1
/data/sdext
/data/sdext2
/data/sdext3
/data/sdext4
/sdcard1 //Sony Xperia Z
/sdcard2 //HTC One M8s
/storage/microsd //ASUS ZenFone 2
对于你想要实现的目标(扫描某些文件的所有可能路径),我认为这样做是非常不可能的(使用已知路径列表)。在同一设备上的一些路径甚至在android升级之间改变。
答案 2 :(得分:1)
根据oceanuz提供的路径,我编写了一个方法,该方法定位外部存储路径(忽略大小写)并将其作为String返回。
注意:我在我的方法中使用了StreamSupport库,因此为了使其工作,您需要下载jar文件并将其添加到项目中的libs文件夹中。是的。
public static String getExternalSdPath(Context context) {
List<String> listOfFoldersToSearch = Arrays.asList("/storage/", "/mnt/", "/removable/", "/data/");
List<String> listOf2DepthFolders = Arrays.asList("sdcard0", "media_rw", "removable");
List<String> listOfExtFolders = Arrays.asList("sdcard1", "extsdcard", "external_sd", "microsd", "emmc", "ext_sd", "sdext",
"sdext1", "sdext2", "sdext3", "sdext4");
final String[] thePath = {""};
Optional<File> optional = StreamSupport.stream(listOfFoldersToSearch)
.filter(s -> {
File folder = new File(s);
return folder.exists() && folder.isDirectory();
}) //I got the ones that exist and are directories
.flatMap(s -> {
try {
List<File> files = Arrays.asList(new File(s).listFiles());
return StreamSupport.stream(files);
} catch (NullPointerException e) {
return StreamSupport.stream(Collections.emptyList());
}
}) //I got all sub-dirs of the main folders
.flatMap(file1 -> {
if (listOf2DepthFolders.contains(file1.getName().toLowerCase())) {
try {
List<File> files = Arrays.asList(file1.listFiles());
return StreamSupport.stream(files);
} catch (NullPointerException e) {
return StreamSupport.stream(Collections.singletonList(file1));
}
} else
return StreamSupport.stream(Collections.singletonList(file1));
}) //Here I got all the 2 depth and 3 depth folders
.filter(o -> listOfExtFolders.contains(o.getName().toLowerCase()))
.findFirst();
optional.ifPresent(file -> thePath[0] = file.getAbsolutePath());
Log.i("Path", thePath[0]);
return thePath[0];
}
如果找不到Sd Card路径,此方法将返回空字符串。
答案 3 :(得分:0)
我试图在索尼Xperia XA上寻找外部SD卡的路径。然后我安装了ES File explorer,它在其特征窗口中清楚地显示了内部或外部任何文件夹的路径。我发现外部SD的路径为/ storage / C4EE-F3A3。我试图将输出文件从Python3保存到外部SD,但它没有权限在内部SD中保存Qpython文件夹以外的任何地方。