Android:打开一对文件时解析URI路径

时间:2015-08-30 14:22:50

标签: android uri android-contentresolver filechooser

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

方案如下:

  1. 用户从dropbox,google drive或其他
  2. 中选择myfile.ext
  3. 通过了解文件名/路径,我想在同一位置解析myfile.ex2并将其打开
  4. 问题是,当使用文件选择器提供的URI时,URI看起来像这样:

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

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

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

1 个答案:

答案 0 :(得分:0)

  

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

其中任何一项都不会可靠,特别是对于您引用的提供商。

  

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

没有

首先,没有绝对路径,因为有问题的文件不必在设备上。毕竟," dropbox,google drive或其他"是云服务,至少对于"其他"的许多价值。没有必要仅仅因为云服务将一个文件下载到设备,即必须将所有文件下载到设备。

其次,没有绝对的路径可以使用,因为智能写的" dropbox,google drive或其他"将在app的部分内部存储空间中显示这些文件,您的应用无法访问这些文件。

第三,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. 如果他们通过他们的API提供更适合您的服务,请切换到您希望与之集成的任何服务使用直接Web服务API。