2014-02-11 71 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

相關問題