1

因此,我正在 4.1 上的 Galaxy s3 和运行 2.3 的旧手机上测试应用程序。这两部手机都没有 sdcard,但是当我Environment.getExternalStorageDirectory().getAbsolutePath()在我的 Galaxy s3 上使用它时,它会将我引导到一个名为 storage 的文件夹中的一个名为 sdcard0 的文件夹。当我在旧手机上运行它时,它会给我路径 mnt/sdcard/ 并且 sdcard 文件夹是只读的。

我正在尝试在这些目录中创建一个文件夹。我可以在我的 s3 上做到这一点,但不能在我的旧手机上做到这一点。

是否有类似于我在旧手机上缺少的存储文件夹的东西,或者我可以在没有 sd 卡的情况下写入 sdcard 文件夹?

编辑:我的清单中有外部写权限

4

1 回答 1

4

正如文档所暗示的,在某些手机上,不要把外部这个词看得太严重:

注意:不要被这里的“外部”这个词弄糊涂了。最好将此目录视为媒体/共享存储。它是一个文件系统,可以保存相对大量的数据,并且在所有应用程序之间共享(不强制执行权限)。 传统上这是一张 SD 卡,但它也可以作为设备中的内置存储实现,与受保护的内部存储不同,并且可以作为文件系统安装在计算机上。

您可以使用-method检查存储是否真的是外部的。如果它不可移动,您应该始终能够写入它(假设您已声明权限)。Environment.isExternalStorageRemovable()

但是,如果它可移动的,则需要使用 . 检查它的当前状态Environment.getExternalStorageState()。这是一个如何使用它的快速示例:

String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write!
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // Mounted read only...
} else {
    // Something is wrong...
}

因此,在这些情况下,您可以写入外部存储。


重要提示:正如文档在多个点上指定的那样,上述方法适用于外部存储。某些设备(如摩托罗拉 Xoom)既有内部“外部”存储,又有 SD 卡。

似乎没有“通用”方式来访问此类设备上的“辅助外部存储”,尽管现在有一个标准,随 Android 4.2 引入

设备可能包含多个外部存储实例,但 目前只有主外部存储通过 API 暴露给开发人员。

[...]

从 Android 4.2 开始,设备可以支持多个用户,并且 外部存储必须满足以下约束

  • [...]
  • 辅助外部存储不得由应用程序写入。

这似乎取决于供应商将哪个存储(内部或真正的外部)视为主要存储。你在这里可以做的不多(没有事情变得混乱......)


如果没有外部存储,您可以使用应用程序Internal Storage或缓存目录,具体取决于您存储的数据类型。

于 2013-05-11T00:33:03.563 回答