将数据保存到KITKAT中的/ externalsdcard/Android/data/<app package name>

mcf*_*oft 5 android android-4.4-kitkat

我读了很多关于KITKAT和防止写入辅助外部SD卡的内容.这似乎是谷歌的一项新政策.我还阅读了关于在/ externalsdcard/Android/data /下存储应用程序数据的内容.

现在我的问题,因为我无法重现或测试:如果不允许应用程序直接在<secundary external sdcard>下写入数据,那么是否可以将应用程序的数据存储在<secundary external sdcard>/Android/data下/ <app package name>?

如果可能的话.有人可以共享代码示例吗?

Yar*_*lyk 4

  • 切勿假设可移动辅助存储大于主内部存储。在大多数现代设备上,内部存储容量可达 64 GB,但 SD 卡可小至 1 MB(如果用户插入小型旧卡)。

  • 使用当前的 API 无法区分哪一个是“外部”的。

所以正确的方法是使用 Context.getExternalFilesDirs(),它返回所有外部存储,您可以在没有任何权限的情况下存储应用程序特定的文件。

使用 StatFs 查找可用的最大存储空间,并将数据写入其中。

final File[] dirs = context.getExternalFilesDirs(null); //null means default type
//find a dir that has most of the space and save using StatFs
Run Code Online (Sandbox Code Playgroud)

正如文档所说,

返回所有外部存储设备上应用程序特定目录的绝对路径,应用程序可以在其中放置其拥有的持久文件。这些文件是应用程序的内部文件,通常作为媒体对用户来说不可见。

这与 getFilesDir() 类似,卸载应用程序时这些文件将被删除,但有一些重要的区别:

外部文件并不总是可用:如果用户将外部存储安装到计算机上或将其删除,它们就会消失。这些文件没有强制执行安全措施。

此处返回的外部存储设备被视为设备的永久部分,包括模拟外部存储和物理媒体插槽,例如电池仓中的 SD 卡。返回的路径不包括瞬态设备,例如 USB 闪存驱动器。

应用程序可以将数据存储在任何或所有返回的设备上。例如,应用程序可能会选择将大文件存储在具有最多可用空间(通过 StatFs 衡量)的设备上。

无需任何权限即可读取或写入返回的路径;调用应用程序始终可以访问它们。辅助外部存储设备上这些路径之外的写入访问不可用。

返回的第一个路径与 getExternalFilesDir(String) 相同。如果存储设备不可用,则返回的路径可能为空。