如何从 DriveId 识别文件与文件夹

How to identify file vs folder from DriveId

在使用 Google Drive Android API (GDAA) 时,我经常需要检索 GDAA parent 的列表 object由 DriveId 标识。但是我找不到可以提供 parent 列表的直接方法。唯一的获取方法是将DriveId转成DriveFile或DriveFolder,然后再应用listParents(GoogleApiClient)方法。

在这里,我 运行 遇到这样一种情况,其中获取 parents 的代码变得丑陋,比如(它被简化了,原来有 try/catch逻辑也是):

static private GoogleApiClient mGAC;
...  
ArrayList<DriveId> getParents(DriveId dId) {
    ArrayList<DriveId> prnts = new ArrayList<>();
    if (dId != null) {
      DriveFile dFile = Drive.DriveApi.getFile(mGAC, dId);
      if (dFile != null) {
        MetadataBufferResult rslt =  dFile.listParents(mGAC).await();
        if (rslt.getStatus().isSuccess()) {
          MetadataBuffer mdb = null;
          try {
            mdb = rslt.getMetadataBuffer();
            for (Metadata md : mdb) {
              if (md == null || !md.isDataValid() || md.isTrashed()) continue;
              prnts.add(md.getDriveId();
            }
          } finally { if (mdb != null) mdb.close(); }
        }
      } else {
        DriveFolder dFldr = Drive.DriveApi.getFolder(mGAC, dId);
        if (dFldr != null) {
          MetadataBufferResult rslt =  dFldr.listParents(mGAC).await();
          if (rslt.getStatus().isSuccess()) {
            MetadataBuffer mdb = null;
            try {
              mdb = rslt.getMetadataBuffer();
              for (Metadata md : mdb) {
                if (md == null || !md.isDataValid() || md.isTrashed()) continue;
                prnts.add(md.getDriveId();
              }
            } finally { if (mdb != null) mdb.close(); }
          }
        }
      }
    }
    return prnts;
  }

简历:

所以它归结为 2 个问题:

  1. 是否有一些 method/indicator 允许我将 DriveId 识别为文件或文件夹?
  2. 是否有某种我不知道的方法可以让我在不通过 getFile() / getFolder() 手套的情况下获得 parent 的列表?

您是否尝试过使用以下方法:Drive.DriveApi.query(googleApiClient, query);

您必须创建适当的查询才能访问文件的父级。此解决方案的好处在于它依赖于 DriveId 而不是 FileId 或 FolderId。解决方案应该类似于:

Query query = new Query.Builder()
    .addFilter(Filters.eq(SearchableField.PARENTS, "DriveId"))
    .build();
Drive.DriveApi.query(googleApiClient, query);

您可以在以下页面阅读有关此解决方案的更多信息:https://developers.google.com/drive/android/queries

我很高兴地报告,随着 GDAA 的发展,一种方法

DriveId.getResourceType()

已引入,允许直接检索 Drive 对象的类型。这是一个代码示例:

/**
 * FOLDER type object inquiry
 * @param driveId Drive ID
 * @return TRUE if FOLDER, FALSE otherwise
 */
static boolean isFolder(DriveId driveId) {
  return driveId != null && driveId.getResourceType() == DriveId.RESOURCE_TYPE_FOLDER;
}

/**
 * FILE type object inquiry
 * @param driveId Drive ID
 * @return TRUE if FILE, FALSE otherwise
 */
static boolean isFile(DriveId driveId) {
  return driveId != null && driveId.getResourceType() == DriveId.RESOURCE_TYPE_FILE;
}