【问题标题】:Android context.getFilesDir() sometimes returns root folderAndroid context.getFilesDir() 有时会返回根文件夹
【发布时间】:2013-12-21 17:29:22
【问题描述】:

在第一次启动应用程序时,我使用 context.getFilesDir() 创建一个文件来获取存储路径。 这工作正常,除了极少数情况外,此方法返回“/”根文件夹。结果应用程序崩溃:

java.io.FileNotFoundException: /my_filename(只读文件系统)

当我在我的设备上调试时,文件路径是:

/data/data/my.package/files/my_filename

此代码在 SherlockActivity 的 onCreate 中调用。所以上下文就是活动的上下文。奇怪的是,这种故障很少见,并且发生故障的设备之间没有共性。

更新: 根据目前的反馈,这段代码应该可以工作,偶尔的失败可能是由于奇怪的设备。试图解决这个问题对于我的用例来说是一种过度杀伤,因为文件存储并不是真正强制性的。我将尝试迁移我的代码以使用 SharedPreferences。

【问题讨论】:

  • 坦率地说,这些听起来像是坏掉的设备——也许是自定义 rom 安装有问题?这不是一个有任何记录在案的失败模式的调用。
  • 可能。尽管失败率很小,但就绝对数量而言,它们值得关注。我无法阻止这些用户下载和评价应用!
  • 您可以检测到这一点并弹出“检测到有缺陷的手机”的内容,或者在这种情况下使用备份位置。

标签: android storage


【解决方案1】:

在所有 4.4 之前的 Android 设备中都存在一个已确认的错误,该错误很少发生。该错误的原因是在首次启动时创建应用程序私有目录时的竞争条件。

建议的解决方法(由 Google Android 团队成员提出)是在第一个失败并返回“null”值后再次尝试 Context.getFilesDir() 方法。

【讨论】:

    【解决方案2】:

    使用

    Environment.getExternalStorageDirectory().getAbsolutePath();
    

    获取外部存储目录。

    使用

    Environment.getCacheDir();
    

    用于使用应用程序的沙盒缓存目录。

    【讨论】:

    • 是的,但这些返回位置用于不同目的,而不是记录问题使用的 API 提供的位置。它们可能是也可能不是可行的替代品。它们可能比问题中使用的 API 更可靠,也可能不可靠。
    • 这些方法对我来说总是很顺利!这就是为什么我建议他们:D
    • 我在文档中没有看到 Environment.getCacheDir() 方法。我只是存储一些设置。我不想妨碍用户的其他文件。
    • 您需要使用 sharedpreferences 来存储设置。这是正确的做法!请参阅有关 sharedpreferences 的 android 文档。
    • 更正 - 您可能会考虑使用共享偏好。但是这个问题试图做的事情并没有错 - 它应该可以工作,并且如果设备符合 Android API 的话。
    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 2019-08-02
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多