【问题标题】:How to check file path (Internal or External) in android如何在android中检查文件路径(内部或外部)
【发布时间】:2016-09-13 13:11:39
【问题描述】:

我正在 android 中创建一个聊天应用程序。当我上传文件时,我无法追踪文件的来源。我需要检查它是来自外部 SD 卡还是内部存储器,以便将文件路径添加到我的数据库 Sqlite。

目前我正在使用以下功能:

 public static boolean isExternalStorageDocument(Uri uri) {
    return "com.android.externalstorage.documents".equals(uri
            .getAuthority());
}

它在 Kitkat 中正确检查,但在 Lolipop 中工作。那么我还能做些什么呢??

【问题讨论】:

  • Uri 不必指向文件系统上您可以访问的文件。
  • 那么我怎样才能得到路径呢?因为我存储了路径,所以对打开文件很有帮助。

标签: android file file-upload


【解决方案1】:

Uri 可以指向任何东西

  • 外部存储上的本地文件
  • 另一个应用程序的内部存储上的本地文件
  • 其他应用的可移动存储上的本地文件
  • 已加密且需要即时解密的本地文件
  • 数据库中BLOB 列中保存的字节流
  • 必须动态生成的文档,例如 Stack Overflow 如何动态生成此页面
  • 需要其他应用先下载的一段内容
  • 等等

没有经验的开发人员认为Uri 只指向一个文件。这从来都不是真的。从今年晚些时候开始,您将很少看到带有file 方案的Uri,因为开发人员会避开the ban on the file scheme。并且没有常识的人会尝试根据对Uri 的检查来推导文件系统路径,因为无法保证即使在有限的情况下,这样的计划也会随着时间的推移而有效,并且它不会处理 vast 用户可以选择的内容源数组。

通过ACTION_OPEN_DOCUMENT 获得的Uri 可能支持可持久的Uri 权限。如果是这样,您可以调用takePersistableUriPermission() 并将Uri 本身保存到您的数据库中。您仍然需要处理内容不再可用的情况(例如,用户删除了它)。

在所有其他情况下,仅在您的流程期间使用Uri。如果您需要在更长时间内访问内容,请将内容复制到您控制的文件中(例如,internal storage)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2014-06-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多