【问题标题】:Verifying that a File path is a SD card验证文件路径是否为 SD 卡
【发布时间】:2018-02-20 21:50:08
【问题描述】:

一天中的大部分时间,我一直在寻找获取 SD 卡目录的方法。我最近发现函数调用getExternalStorageDirectory 在某些情况下会返回一个板载内存路径。我支持 API 19 及更高版本。 stackOverflow 给出的获取 SD 卡路径的常见答案是

Environment.getExternalStorageDirectory().getAbsolutePath();

这不适用于我的设备,因为返回的外部存储是不可移动内存(Samsung Tab S2)。

我已经能够使用getExternalFilesDirs 返回目录列表,在我的测试中它将返回两个目录,即应用程序的板载内存位置和我已安装的 SD 卡。然而函数调用 isExternalStorageRemovable 直到 API 21 才引入。这是我能找到的最明确的候选者,它可以满足我想要做的事情,即确保我实际上正在写入外部 SD 卡。

1) 有没有办法验证 getExternalFilesDirs 返回的目录在 API 19 中是可移动的还是外部的?

2) 是否可以假设,如果唯一的存储用例是“内部存储器”和“内部存储器和 SD 卡”,则 SD 卡位置将始终从 getExternalFilesDirs 返回第二个,就像我在简短测试中发生的那样?

【问题讨论】:

    标签: android


    【解决方案1】:

    我最近发现在某些情况下调用 getExternalStorageDirectory 函数返回的路径是板载内存

    External storage 不是removable storage。在绝大多数 Android 设备上,getExternalStorageDirectory() 返回的位置是板载闪存的一部分。自 Android 3.0 推出以来,这种情况已经持续了大约 7 年。

    有没有办法验证 getExternalFilesDirs 返回的目录在 API 19 中是可移动的还是外部的?

    如果 getExternalFilesDirs() 返回 2+ 个项目,则第二个和后续项目在可移动存储上。

    是否可以假设,如果唯一的存储用例是“内部存储器”和“内部存储器和 SD 卡”

    这不是一个安全的假设。

    SD 卡位置总是会从 getExternalFilesDirs 第二次返回,就像我在简短测试中发生的那样?

    getExternalFilesDirs() 返回的第一个条目与getExternalFilesDir() 返回的相同(旧的单数形式)。虽然绝大多数 Android 设备都有固定的外部存储,但可能有些设备的外部存储实际上是可移动的。在这种情况下,Android SDK 和框架仍然认为这是外部存储——毕竟,这是设备制造商告诉固件要做的。而且,在这种情况下,首先从getExternalFilesDirs() 返回的位置在物理上是可移动的,即使它不是 Android 开发人员通常认为的可移动存储。这是一个边缘场景;我无法说出任何在可移动卡上实现了外部存储的当前设备型号。

    另外,请记住,并非所有可移动存储都采用卡的形式。 USB OTG 拇指驱动器也是可移动存储,对于那些具有 USB A 型端口的设备(例如,Android TV、DeX 扩展坞中的三星 Galaxy S8)来说,更传统的拇指驱动器也是如此。

    确保我实际上是在写入外部 SD 卡。

    强烈建议您停止考虑媒体。使用the Storage Access Framework(例如ACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT)之类的东西,让用户可以从所有可能的地方选择存储内容的位置:外部存储、可移动存储、Google 驱动器、Windows 文件服务器等。

    【讨论】:

      猜你喜欢
      • 2012-11-22
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2020-03-26
      • 1970-01-01
      相关资源
      最近更新 更多