Google云端硬盘Android API - 检查文件夹是否存在

时间:2014-02-11 21:33:07

标签: android google-drive-api google-drive-android-api

我正试图弄清楚如何使用新的Google Drive Android API

检查Google云端硬盘中是否存在文件夹

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

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

如果我尝试创建一个文件,我从上面的代码中得到的文件夹,它也不会崩溃? 我显然很难理解这个新API是如何一起工作的,特别是那些非常有限的教程和SO问题,我真的坚持这个,所以任何输入都将非常感激。< / p>

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

4 个答案:

答案 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)

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