2014-02-11 56 views
14

我想弄清楚如何检查是否使用新的Google Drive Android API谷歌云端硬盘Android API - 检查文件夹是否存在

我已经试过以下在谷歌驱动器存在一个文件夹,以为这样就可以要么崩溃或者如果找不到文件夹,则返回null,但它不会这样做(只要它是有效的DriveId,即使文件夹已被删除)。

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

如果我尝试创建一个文件,我从上面的代码中得到的文件夹,它不会崩溃吗? 我显然很难理解这个新API如何协同工作,特别是对于非常有限的教程和SO问题,我真的被困在这个问题上,所以任何输入都将非常感激。

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

回答

8

经过大量的研究,这是我结束的代码。它工作正常,但有一个问题:当文件夹在Google Drive中被丢弃时,需要一些时间(小时)才能更新从我的应用中获取的元数据,这意味着此代码可以首先检测文件夹是否已被删除几个小时后实际发生的捣毁事件 - 进一步的信息和讨论可以找到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"); 
       } 

      } 
     }; 
} 
+0

感谢您确认这个问题也报告在这里:http://stackoverflow.com/questions/22515028/deleted-files-status-unreliably-reported-in-the-new-google-drive-android-api-gd。只是为了完整。顺便说一句,确保你关闭了与metadataadata.close()的'元数据'缓冲区,如果我不知道资源泄漏。 – seanpj

+0

呵呵,我找不到这样的方法(metadata.close()) - 引用https://developer.android.com/reference/com/google/android/gms/drive/Metadata.html – Jakob

+0

我也没有。但是ADT是唠叨我关于资源泄漏,所以我输入“元数据”。 intellisense显示.close()方法。所以我用它,它停止抱怨。但是,从缓冲区获取的所有'元数据'必须在关闭之前复制/使用。在这里grep任何与'getMetadataBuffer':https://github.com/seanpjanson/140319-Accounts/blob/master/GAC.java,你会看到。我记得在她的演示中向Burcu Dogan提起过这件事,但我没有回应。 – seanpj

-2

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

+0

好想法!我会尝试 – Jakob

+0

我希望它能工作,但没有运气。我能够读取长久文件的所有元数据。像“空垃圾”一样被删除甚至完全删除。和'10多个小时前'一样。我猜Web界面只是插入内部系统的另一个插件,它有一些延迟/同步问题。 – seanpj

+0

是的,我确认使用@seanpj – Jakob

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,但可能与您的问题无关。

+0

此代码与旧版Google Play服务库正常工作,但是当我更新到Google Play Services 7.0.0时,它在AbstractPendingResult类中崩溃 – Harish

+0

欢迎来到GDAA的精彩世界,其中“panta rhei” - 一切都在流。 :-)。你可以看看这个更新后的代码在7.00 +。 https://github.com/seanpjanson/GDAADemo/blob/master/src/main/java/com/andyscan/gdaademo/GDAA.java。实际上,构建树在这里:https://github.com/seanpjanson/GDAADemo/blob/master/src/main/java/com/andyscan/gdaademo/MainActivity。java#L163 – seanpj

+0

@seanpj,感谢您在GDAA方面的长期研究(我认为他们每个月都会改变它)。请编辑链接,如https://github.com/seanpjanson/GDAADemo/blob/master/src/main/java/com/andyscan/gdrtdemo/GDAA.java。 – CoolMind

相关问题