我注意到SO上对此没有一个决定性的答案,因此我正在寻找"如何使用Google Drive Android API检查文件夹是否存在,如果不存在则创建文件夹?"问题的规范答案。理想地显示了使用ResultCallback
的异步方法和使用.await()
的同步方法的示例。
附言:我知道这个问题的标题是一样的,但公认的答案集中在isTrashed()
上已知的滞后错误上,并且不清楚你在代码中的哪一点真正知道文件夹存在。其他答案似乎已经过时了。
这个问题在关注滞后删除状态问题的同时,确实提供了一个测试文件夹是否存在的模式。
使用异步回调:
Query query = new Query.Builder()
.addFilter(Filters.and(Filters.eq(
SearchableField.TITLE, "MyFolder"),
Filters.eq(SearchableField.TRASHED, false)))
.build();
Drive.DriveApi.query(getGoogleApiClient(), query)
.setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
@Override
public void onResult(DriveApi.MetadataBufferResult result) {
if (!result.getStatus().isSuccess()) {
showMessage("Cannot create folder in the root.");
} else {
boolean isFound = false;
for(Metadata m : result.getMetadataBuffer()) {
if (m.getTitle().equals("MyFolder")) {
showMessage("Folder exists");
isFound = true;
break;
}
}
if(!isFound) {
showMessage("Folder not found; creating it.");
MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
.setTitle("MyFolder")
.build();
Drive.DriveApi.getRootFolder(getGoogleApiClient())
.createFolder(getGoogleApiClient(), changeSet)
.setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
@Override
public void onResult(DriveFolder.DriveFolderResult result) {
if (!result.getStatus().isSuccess()) {
showMessage("Error while trying to create the folder");
} else {
showMessage("Created a folder");
}
}
});
}
}
}
});
使用同步.await()
Query query = new Query.Builder()
.addFilter(Filters.and(Filters.eq(
SearchableField.TITLE, "MyFolder"),
Filters.eq(SearchableField.TRASHED, false)))
.build();
DriveApi.MetadataBufferResult result = Drive.DriveApi.query(getGoogleApiClient(), query)
.await();
if (!result.getStatus().isSuccess()) {
showMessage("Cannot create folder in the root.");
} else {
boolean isFound = false;
for(Metadata m : result.getMetadataBuffer()) {
if (m.getTitle().equals("MyFolder")) {
showMessage("Folder exists");
isFound = true;
break;
}
}
if(!isFound) {
showMessage("Folder not found; creating it.");
MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
.setTitle("MyFolder")
.build();
Drive.DriveApi.getRootFolder(getGoogleApiClient())
.createFolder(googleApiClient, changeSet).await();
if (!result.getStatus().isSuccess()) {
showMessage("Error while trying to create the folder");
} else {
showMessage("Created a folder");
}
}
您的报价:
不清楚您在代码中的哪一点真正知道文件夹存在
在RESTApi中,您等待来自'ecexute()'方法的响应。直截了当地说,你就可以把反应时间安排出来。您得到文件夹/文件id(ResourceId),并且您知道它存在于驱动器中。
在GDAA中,看看这个答案。同样,当您收到带有有效ResourceId的完成通知时,您就知道文件夹/文件在"上面"。
好运