【问题标题】:Android: Resolve URI paths when opening a pair of filesAndroid:打开一对文件时解析URI路径
【发布时间】:2015-08-30 14:22:50
【问题描述】:

我正在添加对从另一个 (Windows) 应用程序导入特定类型的文件格式的支持。这种特殊格式将数据保存在一对文件中。这些文件使用相同的文件名,具有不同的扩展名,例如myfile.extmyfile.ex2

场景如下:

  1. 用户从保管箱、谷歌驱动器或其他中选择myfile.ext
  2. 通过知道文件名/路径,我想在同一位置解析myfile.ex2并打开它

问题是,当使用文件选择器提供的 URI 时,URI 看起来像这样:

content://com.google.android.apps.docs.storage/document/acc%3D1%3Bdoc%3D154

这里有几种解决方案,涉及使用getContentResolver() 获取真实文件名,并从返回的光标中选择原始文件名。

有没有通用的方法来获取带有实际文件名的绝对路径,更改扩展名然后打开它?

【问题讨论】:

    标签: android uri android-contentresolver filechooser


    【解决方案1】:

    这里有几种解决方案,涉及使用 getContentResolver() 获取真实文件名,并从返回的光标中选择原始文件名。

    其中任何一个都不会可靠地工作,尤其是对于您引用的提供者。

    有没有通用的方法来获取带有实际文件名的绝对路径,更改扩展名然后打开它?

    没有。

    首先,没有绝对路径,因为相关文件不必在设备上。毕竟,“dropbox、google drive 或其他”都是云服务,至少对于“其他”的许多值而言。没有要求仅仅因为云服务将一个文件下载到设备上,就必须将所有文件下载到设备上。

    其次,没有您必须使用的绝对路径,因为智能编写的“保管箱、谷歌驱动器或其他”将在应用程序的内部存储部分中包含您的应用程序无法访问的文件。

    第三,Uri 是一个不透明的句柄,就像 URL 一样。不要求“dropbox、google drive 或其他”网站提供其服务持有的两个任意文件之间的 Web URL 相对地址。同样,设备上的文件提供程序不要求在其服务持有的两个任意文件之间提供Uri 相对地址,甚至不要求使用可识别的文件名。

    我看到的主要选项是:

    1. 让用户单独选择每个文件。

    2. 让用户合并文件,例如将它们放入 ZIP 存档中。

    3. 让用户选择每个文件,但在一个存储访问框架ACTION_OPEN_DOCUMENT 操作中,通过EXTRA_ALLOW_MULTIPLE(警告:仅当您的minSdkVersion 为19 或更高时才实用,并且您必须处理用户搞砸了并且没有选择两个文件的情况)。

    4. 让用户组织文件,例如将它们放在单个目录/文件夹中,并使用存储访问框架的 ACTION_OPEN_DOCUMENT_TREE Intent(警告:仅当您的 minSdkVersion 为 21 或更高时才实用)。

    5. 切换到对您希望与之集成的任何服务使用直接 Web 服务 API,如果它们通过其 API 为您提供更适合您的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多