DriveResource.listParents不起作用

时间:2014-06-26 15:39:53

标签: android google-drive-api

我正在为Android开发一个应用程序,我需要获取从Google云端硬盘获取的文件的父级列表。

我使用Drive.DriveApi.newOpenFileActivityBuilder()正确获取DriveId,但是当我使用DriveResource.listParents时,即使资源有父级,我也会获得一个空列表。

我对Drive.DriveApi.newOpenFileActivityBuilder()和DriveResource.listParents使用相同的GoogleApiClient,所以我认为这不是范围问题。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (requestCode == Constants.REQUEST_CODE_GOOGLE_DRIVE_FILE_PICKER) {
      if (resultCode == RESULT_OK) {
         mSelectedFileDriveId = (DriveId)    data.getParcelableExtra(OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);
      } else {
         setResult(Constants.RESULT_CODE_KO);
         finish();
      }
   }
}

...

private ResultCallback<MetadataBufferResult> metadataBufferCallback = new ResultCallback<MetadataBufferResult>() {
   @Override
   public void onResult(MetadataBufferResult result) {
      if (!result.getStatus().isSuccess()) {
         SDKUtils.showMessage(thisActivity, "Impossible salvare l'ultima posizione aperta in Google Drive");
          return;
      }
      MetadataBuffer metadataBuffer = result.getMetadataBuffer();
      // HERE I OBTAIN AN EMPTY OBJECT
   }
};

...

mGoogleApiClient = new GoogleApiClient.Builder(this)
              .setAccountName(driveAccontName)
              .addApi(Drive.API)
              .addScope(Drive.SCOPE_FILE)
              .addConnectionCallbacks(this)
              .addOnConnectionFailedListener(this).build();

...

DriveFile driveFile = Drive.DriveApi.getFile(getGoogleApiClient(), mSelectedFileDriveId);
driveFile.listParents(GoogleApiClient apiClient).setResultCallback(metadataBufferCallback);

有什么建议吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

所以我认为这不是范围问题。

正是这样 - 范围问题!!!

Google Drive Android API仅提供drive.file和drive.appfolder范围。

文件范围意味着只能访问用户从您的应用程序中选择的那些文件。 Drive.DriveApi.newOpenFileActivityBuilder()对话框将允许用户浏览整个驱动器,但只允许您的应用程序访问用户专门Select的文件或文件夹。

假设您的驱动器上有以下文件夹结构 -

    /root
      |
      +---books
          +---c++
              +---programming_gems.pdf
              +---c++_notes.docs

现在使用Drive.DriveApi.newOpenFileActivityBuilder(),您可以选择programming_gems.pdf。 您的应用现已获得该pdf的访问权限。您可以检索文件及其元数据。 但是在这种情况下,您的应用将无法访问其父文件夹,c ++。 为什么?因为用户还没有访问c ++文件夹;只有一个特定的文件 那个文件夹。这也是有道理的;否则你可以从该文件夹中检索任何文件 让你的用户担心。

使用相同的Drive.DriveApi.newOpenFileActivityBuilder()获取c ++文件夹。现在,如果你的 app尝试检索programming_gems.pdf的父文件夹,它被授予访问权限。

现在再试一次;尝试列出c ++文件夹本身的内容。什么会回来 你的应用? - 只有programming_gems.pdf。为什么,因为用户没有授予对方的访问权限 file,c ++ _ notes.docs。

我希望很清楚。

P.S。

  1. 顺便说一句,要在拾取文件或文件夹之间进行选择,您必须设置mime类型。 请参阅以下代码,例如

    if (openFolder) {
        mime_type = new String[]{DriveFolder.MIME_TYPE};
    } else {
        mime_type = new String[]{};
    }
    
    IntentSender intentSender = Drive.DriveApi
            .newOpenFileActivityBuilder()
            .setMimeType(mime_type)
            .build(getGoogleApiClient());
    
  2. 如果此示波器方案与您的要求不符,您可以选择使用Google Drive REST API - 继续阅读 - https://stackoverflow.com/a/25871516/1363471