如何从 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;
}
简历:
- 检查 DriveId 是否成功转换为 DriveFile,如果没有,re-test它和 DriveFolder 真的很麻烦。
- 我不明白为什么我不能直接从 DriveId 中获取 parent Id。如果 DriveId 代表文件或文件夹,它可能有什么区别。
所以它归结为 2 个问题:
- 是否有一些 method/indicator 允许我将 DriveId 识别为文件或文件夹?
- 是否有某种我不知道的方法可以让我在不通过 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;
}
在使用 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;
}
简历:
- 检查 DriveId 是否成功转换为 DriveFile,如果没有,re-test它和 DriveFolder 真的很麻烦。
- 我不明白为什么我不能直接从 DriveId 中获取 parent Id。如果 DriveId 代表文件或文件夹,它可能有什么区别。
所以它归结为 2 个问题:
- 是否有一些 method/indicator 允许我将 DriveId 识别为文件或文件夹?
- 是否有某种我不知道的方法可以让我在不通过 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;
}