【问题标题】:Can you write to the sdcard folder when there is no sdcard?没有sdcard的时候可以写到sdcard文件夹吗?
【发布时间】:2013-05-10 23:16:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 只是一种预感,但您是否尝试过不使用 getAbsolutePath()?
  • 插入 SD 卡后,系统会将其挂载到该挂载点。如果没有 sdcard,它只是一个指向任何内容的挂载点。所以,不,你不能写信给它。
  • getExternalStorageState() 说什么?
  • 很确定 S3s sdcard0 是它的内部存储。令人困惑的命名,但我认为是这样!
  • 能否提供更多细节、代码示例和结果?

标签: android sd-card


【解决方案1】:

在某些手机上,正如documentation 所暗示的那样,external 这个词不要太认真:

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

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

如果它可移动的,您需要使用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...
}

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


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

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

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

[...]

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

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

这似乎取决于供应商将哪个存储(内部或真实外部)视为主要存储。在这里您无能为力(不会弄得一团糟……)


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2011-01-28
    • 2012-04-16
    • 2018-10-05
    • 2012-07-12
    • 2016-11-04
    • 2012-07-06
    相关资源
    最近更新 更多