17

我试图弄清楚如何使用新的Google Drive Android API检查 Google Drive 中是否存在文件夹

我尝试了以下方法,认为如果找不到文件夹,它会崩溃或返回 null,但它不会这样做(只要它是有效的DriveId,即使文件夹已被删除)。

DriveFolder folder = Drive.DriveApi.getFolder(getGoogleApiClient(), driveId));

如果我尝试从上面的代码中创建一个文件夹,它也不会崩溃?很明显,我很难理解这个新 API 是如何协同工作的,尤其是在非常有限的教程和 SO 问题的情况下,我真的坚持这个,所以任何输入都将不胜感激。

只是为了澄清我的问题:我正在指定的 Google Drive 文件夹中创建一个文件,但如果该文件夹不存在(已被用户删除),我想先创建它。

4

4 回答 4

8

经过大量研究,这是我最终得到的代码。它工作正常,但有一个问题:当一个文件夹在 Google Drive 中被丢弃时,我可以从我的应用程序中获取的元数据需要一些时间(小时)才能更新,这意味着此代码可以首先检测文件夹是否已被丢弃几个小时后,垃圾事件实际发生了——更多信息和讨论可以在这里找到。

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"); 
                }

            }
        };
}
于 2014-03-19T19:11:59.753 回答
1

如果您要根据文件夹的存在状态创建文件夹,这里的“createTree()”方法就是这样做的。

以下 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()”状态。由于网络上的“删除”文件只会将其移动到垃圾箱。此外,一般删除(在网站上,因为 API 中没有“删除”)有点不稳定。我测试了一段时间,可能需要几个小时才能更新“isTrashed()”状态。而且手动清空 Google Drive 中的垃圾箱也是不可靠的。在 Github 上查看这个问题

这里有更多讨论,但可能与您的问题无关。

于 2014-03-09T23:08:02.503 回答
0

所以今天的答案是过时的 API。因此,我发布了如何通过新的文档更新检查文件夹是否存在的示例:

     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"
于 2020-09-16T14:19:06.630 回答
-2

您可以尝试获取文件夹的元数据。如果该文件夹不存在,这将失败。

于 2014-03-05T00:18:42.217 回答