题 制造商可移动存储(外部)SD卡路径


我一直在谷歌搜索,但很难找到制造商/型号使用哪个路径的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闪存驱动器以查找某个文件。如果我遗漏了任何路径,请添加到上面的列表中。如果有人知道每个制造商使用的路径,请与我们分享。


31
2017-12-20 16:58


起源


请注意,getExternalStorageDirectory()不会返回“内部存储”,但它可能会返回内部存储,甚至可能返回在内部存储中实现的虚拟分区,但具有与外部存储概念匹配的访问权限。至于你的问题,你可能会检查/ proc / mounts然而要注意,在一些最近的设备上,可能根本不再能够访问其他系统可能已写入的可移动介质的部分。 - Chris Stratton
github.com/jow-ct/Environment2 代码有点德语,但它试图解析 /etc/vold.fstab 其中包含所有真正的外部存储空间 - zapl
您好zapl,/ etc / void.fstab或/etc/void.config是查看外部存储所在位置的真正好地方。谢谢。但是,Galaxy Nexus没有这两个文件,因为它没有外部micro-SD插槽。但我担心依赖于void.fstab对于每个设备都是稳定的。 - jclova
@jclova我试图找出相同的,因为你似乎已经对这个主题进行了更多的研究,你认为可以在这些路径上调用android媒体扫描程序吗?在我的情况下,媒体扫描仪只扫描如果提供getExternalStorage() - Ahmed
@Ahmed,对不起,我没有研究媒体扫描仪的行为。 - jclova


答案:


好消息!在KitKat中,现在有一个用于与这些辅助共享存储设备交互的公共API。

新的 Context.getExternalFilesDirs() 和 Context.getExternalCacheDirs() 方法可以返回多个路径,包括主设备和辅助设备。然后,您可以迭代它们并检查 Environment.getStorageState() 和 File.getFreeSpace() 确定存储文件的最佳位置。这些方法也可用 ContextCompat 在support-v4库中。

另请注意,如果您只对使用返回的目录感兴趣 Context,你不再需要了 READ_ 要么 WRITE_EXTERNAL_STORAGE 权限。展望未来,您将始终拥有对这些目录的读/写访问权限,而无需其他权限。

应用程序还可以通过终止其权限请求继续处理旧设备,如下所示:

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />

12
2018-03-20 23:25





我也从一个像你这样的列表开始(抱歉找不到原始源)并继续添加从用户反馈中收集的一些路径。上面的列表有重复。

    /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升级之间改变。


11
2018-01-23 15:23



感谢您提供此解决方案,我已将其添加到我的应用中。不幸的是,这种行为导致了问题:在升级到Android 4.4.2之后的索尼Xperia Z1上,路径/ storage / removable / sdcard1变为只读!更多信息: androidpolice.com/2014/02/17/... 所以,我将使用Context#getExternalFilesDir() - Martin Vysny
从4.4开始,有“官方”方式获取外部存储目录(通过context.getExternalFilesDirs(“external”))。因此,只有较低版本的Android才需要这样的解决方法。 - Jörg Eisfeld
@JörgEisfeld但是 context.getExternalFileDirs 仅获取应用程序特定路径,而不是根目录 - HendraWD
关于什么 /storage/sdcard0? - HendraWD
小米电视盒1代发现的是 /storage/external_storage/sda1 - Johnny


基于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卡路径,此方法将返回空字符串。


1
2018-05-15 14:09





我试图在索尼Xperia XA上寻找外部SD卡的路径。然后我安装了ES File explorer,它在其特征窗口中清楚地显示了内部或外部任何文件夹的路径。我发现外部SD的路径为/ storage / C4EE-F3A3。我试图将输出文件从Python3保存到外部SD,但它没有权限保存内部SD中除Qpython文件夹以外的任何地方。


0
2018-03-26 22:39





你有没有尝试过:

Environment.getExternalStoragePublicDirectory.getExternalStorageDirectory(String type);

其中type是android定义的目录,你需要像Environment.DIRECTORY_DOWNLOADS那样,它会给你下载目录

它不是“getExternalStorageDirectory”,而是“getExternalStoragePublicDirectory”。请注意,对于每个Android设备,它将返回存储发生的位置(例如:/ mnt / external_sd)在我的变换器101,nexus 10和galaxy s2上工作。我需要它来下载存储上的文件

这是文档 http://developer.android.com/reference/android/os/Environment.html


-3
2018-02-27 18:37



Environment.getExternalStoragePublicDirectory.getExternalStorageDirectory();不存在。你的意思是Environment.getExternalStoragePublicDirectory(字符串类型)?如果是这样,什么进入类型参数? - jclova
是的,我的坏,我会编辑我的答案 - Dante
对不起Environment.getExternalStoragePublicDirectory.getExternalStorageDirectory(String type);也不存在。 - jclova
并且也不适用于Galaxy S3。 - tmanthey
小米电视盒将永远回归 /storage/emulated/0/。外部USB是否插件。它对我不起作用。 - Johnny