如何启用 Intent 选择 Google Docs 文件(保存在 Google Drive 上)?

Posted

技术标签:

【中文标题】如何启用 Intent 选择 Google Docs 文件(保存在 Google Drive 上)?【英文标题】:How to enable picking Google Docs files (kept on Google Drive) with Intent? 【发布时间】:2020-09-17 14:14:50 【问题描述】:

我想在我的 android 应用程序中选择保存在 Google Drive 上的 Google Docs 文件,然后 - 从中​​读取一些数据(但这超出了这个问题的范围)。所以一开始我只想点击那个文件并得到一些回调。我在 Google Drive Android API Deprecation 上关注 this recommendations 并迁移到 Google Drive Rest API。

我设法与 Google Drive 的文件列表对话,但我无法选择 Google Docs 文件(我可以看到它们,但它们无法点击它们)。同时,如果我设置了它们的 MIME 类型,我可以选择其他类型的文件 - 例如 PDF、PNG。

现在我使用这段代码:

val pickerIntent = Intent(Intent.ACTION_OPEN_DOCUMENT)
pickerIntent.addCategory(Intent.CATEGORY_OPENABLE)
pickerIntent.type = "*/*"
val mimeTypes = arrayOf(
     "application/pdf", // works
     "image/png", //works
     // none of MIME below works
     "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
     "application/vnd.google-apps.document",
     "application/vnd.google-apps.file"
)
pickerIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes)

在official sample 中,他们以 MIME "text/plain" 为例,所以对我没有帮助。

我尝试了几种可以找到的 MIME 类型(例如 here 和 here),但都没有解决问题。

应该为此使用什么 MIME 类型?或者问题可能不在 MIME 类型中?

【问题讨论】:

【参考方案1】:

我在this official documentation's article 中发现了问题的根源。

问题是 Google Doc 文件 - 与“真实”PDF|PNG 文件不同,它们是所谓的“虚拟”文件,因为它们没有二进制表示。

我的问题的明确答案是文档中的下一个注释:

注意:由于应用无法通过 openInputStream() 方法直接打开虚拟文件,因此在创建包含 ACTION_OPEN_DOCUMENT 或 ACTION_OPEN_DOCUMENT_TREE 操作的 Intent 时,请勿使用 CATEGORY_OPENABLE 类别

所以删除下一行后问题就解决了:

pickerIntent.addCategory(Intent.CATEGORY_OPENABLE)

此外,我承认,Google Doc 的选择器过滤器适用于下一个 MIME:

"application/vnd.google-apps.document"

【讨论】:

我也有类似的问题。但这个解决方案对我不起作用。你能看看this question吗?

以上是关于如何启用 Intent 选择 Google Docs 文件(保存在 Google Drive 上)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的站点中启用来自 Google 的此凭据选择器?

如何使用服务帐户访问 Google Doc Api?

如何使用 Intent 启动 Google Map 活动

dialogflow context vs. intent - 设计选择

如何仅从 Google Photos 应用程序中选择图像? Android 谷歌照片意图

如何在地理 URI Intent 启动的地图中显示标记?