我一直在寻找一种获取SD卡目录的方法。我最近发现在某些情况下函数调用getExternalStorageDirectory会返回一个存储器内存路径。我支持API 19及更高版本。 常见的答案stackOverflow给出了SD卡路径
Environment.getExternalStorageDirectory()getAbsolutePath();
这对我的设备无效,因为返回的外部存储是不可移动的内存(Samsung Tab S2)。
我已经能够使用getExternalFilesDirs返回目录列表,在我的测试中,它将返回两个目录,即应用程序的板载内存位置和I&#的SD卡39;已安装。但是函数调用 直到API 21才引入isExternalStorageRemovable。这是我能找到的最清楚的候选人,它可以满足我的目的,这就是确保我实际上是在写外部SD卡。
1)有没有办法验证getExternalFilesDirs返回的目录在API 19中是可移除的还是外部的?
2)可以假设,如果唯一的存储用例是"内存和#34;和#34;内存和SD卡" SD卡位置将始终从getExternalFilesDirs返回第二,就像在我的简短测试中发生的那样?
答案 0 :(得分:0)
我最近发现函数调用getExternalStorageDirectory在某些情况下会返回一个路径内存
External storage不是removable storage。在绝大多数Android设备上,getExternalStorageDirectory()
返回一个位于板载闪存中的位置。自Android 3.0推出以来,情况已经持续了大约7年。
有没有办法验证getExternalFilesDirs返回的目录在API 19中是可移除的还是外部的?
如果getExternalFilesDirs()
返回2个以上的项目,则第二个和后续项目都在可移动存储上。
可以假设,如果唯一的存储用例是"内存和#34;和"内部存储器和SD卡"
这不是一个安全的假设。
SD卡位置将始终从getExternalFilesDirs返回第二位,就像在我的简短测试中发生的那样?
getExternalFilesDirs()
返回的第一个条目与getExternalFilesDir()
返回的条目相同(较旧的单数形式)。虽然绝大多数Android设备都有固定的外部存储,但可能有些设备的外部存储实际上是可移动的。在这种情况下,Android SDK和框架仍然认为这是外部存储 - 毕竟,这就是设备制造商告诉固件要做的事情。并且,在这种情况下,首先从getExternalFilesDirs()
返回的位置将是物理可移除的,即使它不是Android开发人员通常认为的可移动存储。这是一个边缘场景;我不能说出任何在可移动卡上实现外部存储的当前设备型号。
另外,请记住,并非所有可移动存储都采用卡的形式。 USB OTG拇指驱动器也是可移动存储,对于那些具有USB A型端口的设备(例如,Android电视,DeX底座中的Samsung Galaxy S8),更传统的拇指驱动器也是如此。
确保我实际上是在写外部SD卡。
我强烈建议你不要再考虑媒体了。使用诸如the Storage Access Framework之类的内容(例如ACTION_OPEN_DOCUMENT
,ACTION_CREATE_DOCUMENT
),以允许用户选择存储来自所有可能性的内容的位置:外部存储,可移动存储,Google驱动器,Windows文件服务器等