【问题标题】:ACTION_GET_CONTENT gives wrong pathACTION_GET_CONTENT 给出了错误的路径
【发布时间】:2015-09-16 03:44:56
【问题描述】:

我正在使用 ACTION_GET_CONTENT 以便用户可以选择我的其余代码可以读取和处理的文本文件。

Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("text/*");
startActivityForResult(Intent.createChooser(intent, "select data"), SELECT_DATA);

上面是我的代码,以便用户可以浏览哪些工作正常。

Uri DataUri = data.getData();
File FileUri = new File(DataUri.getPath());

如果我在使用 getPath 或 getAbsolutePath 后将 DataUri 或 FileUri 转换为字符串,则会得到完全错误的路径。

路径应该是/storage/emulated/0/Documents/myFile,但它给了我/document/primary:Documents/myFile。我不知道这个“primary:Documents”是什么。

intent 本身的数据已经有错误的路径,有什么建议吗?

【问题讨论】:

  • The path should be ... 是什么让你这么想?是什么让您认为您收到的 Uri 代表一个文件对象?还有许多其他类型的资源可以用 Uri 表示。

标签: java android


【解决方案1】:

我正在使用 ACTION_GET_CONTENT 以便用户可以选择文本文件

不,您正在使用 ACTION_GET_CONTENT,以便用户可以选择 MIME 类型为 text/* 的某些内容。内容的来源在很大程度上取决于用户。它可能是也可能不是文件系统上的文件,如果是,它可能是也可能不是您可以直接访问的文件(例如,Dropbox 应用程序的内部存储,Android 4.4+ 设备上可移动存储上的文件)。

路径应该是/storage/emulated/0/Documents/myFile

不,不应该。

但它给了我 /document/primary:Documents/myFile

您获得的内容会因处理 ACTION_GET_CONTENT 请求的任何活动而异。该活动是什么将取决于用户安装的支持ACTION_GET_CONTENT 的内容以及用户从已安装内容列表中选择的内容。

通常,您会得到一个contentUri(即Uri 上的getScheme() 将返回content),因为Uri 将指向由ContentProvider 提供的数据。

intent 本身的数据已经有错误的路径

它有正确的路径。它根本不是文件系统上的路径。

有什么建议吗?

使用ContentResolveropenInputStream()content Uri 所代表的内容获取InputStream

【讨论】:

  • 我现在明白了。我没有完全理解 ACTION_GET_CONTENT 所以现在肯定更清楚了。使用BufferedReader reader = new BufferedReader(new InputStreamReader(getContentResolver().openInputStream(DataUri))); 会相同吗?它似乎仍然无法正常工作。我将它作为字符串传递给字符串数组,使用 Uri.parse(UriString) 将其转换回来,然后使用该 Uri 打开一个流。
  • @Marakalastic:“使用...是否相同?” ——与什么相同? “我将它作为字符串传递到字符串数组中,然后使用 Uri.parse(UriString) 将其转换回来,然后使用该 Uri 打开一个流”——确保你得到的Uri毕竟是相同的@ 987654339@ 您开始使用的。另外,请记住这些Uri 值是短暂的。您不能持久保存它们,例如,计划在下次运行应用程序时再次使用它们。将它们视为类似于需要会话 cookie 的 Web 服务器 URL。
  • 我的意思与仅使用 ContentResolver 相同,但我意识到这是同一回事。是的,它是一样的,只是用不同的方法但在同一个活动中完成。我知道 Uri 是相同的,因为我之后在异常发生之前从我的数组中打印了我们的 Uri。此外,我也几乎复制并粘贴了整个 getContentResolver 代码。唯一的区别是我没有将它从 Uri 更改为字符串并返回。最初,我想将一堆路径存储在一个数组中,以便我可以一个一个地打开它们。我现在选择将数据作为字符串存储在数组中。
  • @Marakalastic:“它似乎仍然不起作用”——你的症状具体是什么?
  • @Marakalastic:如果可以,请编辑您的问题并发布完整的堆栈跟踪(因为堆栈跟踪在 SO cmets 中无法正常工作......)。 “以相同的方法执行 BufferedReader 解决了这个问题”——这强烈表明您的阵列工作后的 Uri 与阵列工作前的 Uri 不同。
猜你喜欢
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
相关资源
最近更新 更多