我正试图弄清楚如何使用新的Google Drive Android API
检查Google云端硬盘中是否存在文件夹我已经尝试了以下内容,认为如果找不到该文件夹,它会崩溃或返回null,但它不会这样做(只要它是有效的DriveId,即使该文件夹已被删除)。
DriveFolder folder = Drive.DriveApi.getFolder(getGoogleApiClient(), driveId));
如果我尝试创建一个文件,我从上面的代码中得到的文件夹,它也不会崩溃? 我显然很难理解这个新API是如何一起工作的,特别是那些非常有限的教程和SO问题,我真的坚持这个,所以任何输入都将非常感激。< / p>
只是为了澄清我的问题:我在指定的Google云端硬盘文件夹中创建了一个文件,但如果该文件夹不存在(已被用户删除),我想先创建它。
答案 0 :(得分:8)
经过大量研究,这是我最终得到的代码。它运行正常,但有一个问题:当文件夹在Google云端硬盘中被删除时,我需要花费一些时间(小时)才能更新我可以从我的应用中获取的元数据,这意味着此代码可以首先检测文件夹是否已被删除几个小时后,实际发生了垃圾事件 - 可以找到进一步的信息和讨论here。
public class checkFolderActivity extends BaseDemoActivity {
@Override
public void onConnected(Bundle connectionHint) {
super.onConnected(connectionHint);
DriveId folderId = DriveId.decodeFromString(folderId);
DriveFolder folder = Drive.DriveApi.getFolder(mGoogleApiClient, folderId);
folder.getMetadata(mGoogleApiClient).setResultCallback(metadataRetrievedCallback);
}
final private ResultCallback<DriveResource.MetadataResult> metadataRetrievedCallback = new
ResultCallback<DriveResource.MetadataResult>() {
@Override
public void onResult(DriveResource.MetadataResult result) {
if (!result.getStatus().isSuccess()) {
Log.v(TAG, "Problem while trying to fetch metadata.");
return;
}
Metadata metadata = result.getMetadata();
if(metadata.isTrashed()){
Log.v(TAG, "Folder is trashed");
}else{
Log.v(TAG, "Folder is not trashed");
}
}
};
}
答案 1 :(得分:1)
如果你是根据它的存在状态创建一个文件夹,'createTree()' method here 就是这样做的。
以下2个代码段基于传递的参数列出文件/文件夹(在文件夹内,全局,基于MIME类型...)。带有 md.getTitle()的行是您可以用来查询文件/文件夹的行。
GoogleApiClient _gac;
void findAll(String title, String mime, DriveFolder fldr) {
ArrayList<Filter> fltrs = new ArrayList<Filter>();
fltrs.add(Filters.eq(SearchableField.TRASHED, false));
if (title != null) fltrs.add(Filters.eq(SearchableField.TITLE, title));
if (mime != null) fltrs.add(Filters.eq(SearchableField.MIME_TYPE, mime));
Query qry = new Query.Builder().addFilter(Filters.and(fltrs)).build();
MetadataBufferResult rslt = (fldr == null) ? Drive.DriveApi.query(_gac, qry).await() :
fldr.queryChildren(_gac, qry).await();
if (rslt.getStatus().isSuccess()) {
MetadataBuffer mdb = null;
try {
mdb = rslt.getMetadataBuffer();
if (mdb == null) return null;
for (Metadata md : mdb) {
if ((md == null) || md.isTrashed()) continue;
--->>>> md.getTitle()
}
} finally { if (mdb != null) mdb.close(); }
}
}
void listAll(DriveFolder fldr) {
MetadataBufferResult rslt = fldr.listChildren(_gac).await();
if (rslt.getStatus().isSuccess()) {
MetadataBuffer mdb = null;
try {
mdb = rslt.getMetadataBuffer();
if (mdb == null) return null;
for (Metadata md : mdb) {
if ((md == null) || md.isTrashed()) continue;
--->>>> md.getTitle()
}
} finally { if (mdb != null) mdb.close(); }
}
}
密钥可能正在检查“isTrashed()”状态。由于网络上的“删除”文件仅将其移至TRASH。此外,删除一般(在网站上,since there is no 'DELETE' in the API)有点不稳定。我正在测试它一段时间,可能需要几个小时才能更新“isTrashed()”状态。手动清空Google云端硬盘中的垃圾箱也是不可靠的。请参阅此issue on Github。
有一点more talk here,但可能与您的问题无关。
答案 2 :(得分:0)
因此,今天answer的API已过期。 因此,我发布了一个示例,说明如何使用documentation的新更新检查文件夹是否存在:
fun checkFolder(name: String):Boolean {
check(googleDriveService != null) { "You have to init Google Drive Service first!" }
return search(name, FOLDER_MIME_TYPE)
}
private fun search(name: String, mimeType:String): Boolean {
var pageToken: String? = null
do {
val result: FileList =
googleDriveService!!
.files()
.list()
.setQ("mimeType='$FOLDER_MIME_TYPE'")
.setSpaces("drive")
.setFields("nextPageToken, files(id, name)")
.setPageToken(pageToken)
.execute()
for (file in result.files) {
Log.d(TAG_UPLOAD_FILE , "Found file: %s (%s)\n ${file.name}, ${file.id} ")
if (name == file.name) return true
}
pageToken = result.nextPageToken
} while (pageToken != null)
return false
}
private const val FOLDER_MIME_TYPE= "application/vnd.google-apps.folder"
答案 3 :(得分:-2)
您可以尝试获取该文件夹的元数据。如果该文件夹不存在,则会失败。