适用于Android的Drive API无法访问由相同应用创建的文件

时间:2015-10-25 07:20:12

标签: android google-drive-api

我正在编写一个应用程序,其中一个用户将通过此应用程序编写文件,并使用链接与其他用户共享。其他用户将使用相同的移动应用程序读取该文件。我正在使用'Drive API for Android'来使用离线写入和增量更新功能,以便读者只能下载新添加或更新的文件部分,而不是每次都下载完整文件。

但遗憾的是,该应用由一个用户创建的文件/文件夹无法通过其他设备上的同一个应用访问。我使用方法Drive.DriveApi.fetchDriveId与文件夹ID并获取以下错误消息。

“未找到驱动器项目,或者您无权访问它。”

文件/文件夹可以在具有相同ID的同一设备上访问,但在其他设备上无法访问,这表明错误消息的第二部分是真正的原因。

使用当前范围(Drive.SCOPE_FILE),我希望该文件可以访问,因为它是由同一个应用程序创建的,但它无法正常工作。

所以我的问题是“Google Drive会在创建文件/文件夹时存储设备信息,并且不允许不同设备上的同一个应用程序使用它吗?”如果没有,那一定是我在实现中的错误,我可以进一步调试。

2 个答案:

答案 0 :(得分:0)

我有一个类似的问题,但没有Android应用程序,但JavaScript应用程序(应该不重要的IMO),我想访问共享文件而不是文件夹。但是,我想我的解决方法也可以帮到你。

第一种方法是使用完整的身份验证范围(请参阅https://developers.google.com/drive/web/scopes

https://www.googleapis.com/auth/drive

但这并不是真正的需要,因为您应该向用户请求尽可能少的权利。因此,我的解决方法如下:

  1. 我使用了Drive UI Integration
    • 转到https://console.developers.google.com/apis/api/drive/drive_sdk
    • 选择" Drive UI Integration"标签
    • 填写表格,我使用了以下内容:
      • "申请名称"
      • 强制性"应用程序图标"
      • 已激活"当用户从Google云端硬盘打开我的应用时,自动显示OAuth 2.0同意屏幕"并输入了我的"客户ID"
      • 使用虚拟网址打开网址"打开网址" (例如,http://example.com
      • 提供了一个默认的文件扩展名(这样,当用户打开文件时,将会建议您的应用程序)
    • 保存更改
  2. 将以下范围添加到您的应用
  3. https://www.googleapis.com/auth/drive.install

    1. 用户将在批准所请求的权利时安装您的应用
    2. 请求您的用户使用" dummy"打开共享文件。谷歌驱动器文件夹中的应用程序,它将授予您的应用程序访问该文件的权限(如下所述:https://developers.google.com/drive/web/scopes - https://www.googleapis.com/auth/drive.file =对应用程序创建或打开的文件的每个文件访问权限 - 通知打开虚拟应用程序时用户将看到错误消息。您可能应该实现一个打开的网址,上面写着"感谢您批准访问文件xYZ"。
    3. 您的应用现在可以访问共享文件。
    4. 我知道,它不是非常人性化,但它有效(至少现在,可能是这不是故意的) 如果您知道通过调用某个URL自动打开带有应用程序的文件的方法,那么请告诉我。 (但是,这在Google API中会出现安全问题,所以我想这是不可能的。)

      由于它有点麻烦,我会向用户提出以下两个选项(因此她/他可以决定她/他自己):

      1. 让应用程序完全访问并且不以隐私为代价关注此问题(我当然不是邪恶的,不会对文件做任何事情,但可能是有人可以破解我的应用程序并获得访问帐户,然后......好吧,然后用户希望给我的应用程序更少的权利。)
      2. 另外只提供安装权限,但是很难打开应用程序需要访问的每个文件。在我的情况下,这是相对罕见的,所以它不应该真的打扰用户。
      3. 我希望有所帮助。

答案 1 :(得分:0)

您可以添加完全允许的驱动器范围 - https://www.googleapis.com/auth/drive

使用 -

请求范围
.requestScopes(new Scope("https://www.googleapis.com/auth/drive"))

而不是

.resuestScopes(Drive.SCOPE_FILE)