【问题标题】:Removable storage (external) sdcard path by manufacturers制造商的可移动存储(外部)SD卡路径
【发布时间】:2012-12-08 06:10:16
【问题描述】:

我一直在谷歌搜索,但很难找到哪些制造商/型号使用 sdcard/外部存储的哪个路径。

  • 我不是在谈论可以通过以下方式找到的内部存储路径:

Environment.getExternalStorageDirectory()

我知道getExternalStorageDirectory() 有时会指向某些设备上的外部 sdcard。

这是我找到的一些外部路径的常用路径(不确定哪个制造商使用哪个路径):

/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 闪存驱动器以查找某个文件。如果我缺少任何路径,请添加到上面的列表中。如果有人知道每个制造商使用的路径,请与我们分享。

【问题讨论】:

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

标签: android path sd-card android-sdcard


【解决方案1】:

我还从某个地方的类似您的列表开始(抱歉找不到原始来源)并继续添加从用户反馈中收集的一些路径。上面的列表有重复项。

    /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 升级之间发生了变化。

【讨论】:

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

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

新的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" />

【讨论】:

    【解决方案3】:

    根据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 卡路径,此方法将返回一个空字符串。

    【讨论】:

      【解决方案4】:

      我试图在 Sony Xperia XA 上找到我的外部 SD 卡的路径。然后我安装了 ES 文件资源管理器,并在其特征窗口中清楚地显示了任何文件夹(内部或外部)的路径。我发现外部 SD 的路径为 /storage/C4EE-F3A3。我试图将输出文件从 Python3 保存到外部 SD,但它没有权限在内部 SD 中保存除 Qpython 文件夹以外的任何位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-17
        • 1970-01-01
        • 2013-05-25
        • 2013-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多