2014-02-11 5 views
14

나는 폴더가 내가 다음을 시도했습니다 새로운 Google Drive Android API구글 드라이브 안드로이드 API는 - 폴더

를 사용하여 Google 드라이브에 존재하는지 확인하는 방법을 알아 내려고 생각하는 것으로는 것 중 충돌하고있어 존재하는지 확인 폴더가 발견되지 않았던 경우는 null를 돌려줍니다 만, 그 폴더는 발견되지 않습니다. 다만, 폴더가 삭제 되어도 유효한 DriveId 인 경우와 같습니다.

위 코드에서 얻은 폴더를 만들려고해도 충돌이 발생하지 않습니까? 이 새로운 API가 모두 함께 작동하는 방식을 이해하는 데 어려움을 겪고 있습니다. 특히 매우 제한된 자습서 및 SO 질문이 있습니다. 실제로이 점에 유의해야합니다. 따라서 모든 입력이 크게 감사 할 것입니다.

내 문제를 명확히하기 위해 : 지정된 Google 드라이브 폴더에 파일을 만들지 만 폴더가 없으면 (사용자가 삭제 한 경우) 먼저 파일을 만들고 싶습니다.

답변

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

      } 
     }; 
} 
+0

문제를 확인해 주셔서 감사합니다. http://stackoverflow.com/questions/22515028/deleted-files-status-unreliably-reported-in-the-new-google-drive-android-api-gd. 완전을 위해서. 물론, meatadata.close()를 사용하여 'metadata'버퍼를 닫았는지 확인하지 않으면 리소스 누출이 발생합니다. – seanpj

+0

허, 나는 그런 방법 (metadata.close())을 찾을 수 없다 - 참고 https://developer.android.com/reference/com/google/android/gms/drive/Metadata.html – Jakob

+0

나도 마찬가지였다. 그러나 ADT는 리소스 누출에 대한 잔소리, 그래서 "메타 데이터"를 입력했습니다. intellisense는 .close() 메소드를 보여주었습니다. 그래서 나는 그것을 사용하고 불평을 멈추게했다. 그러나 버퍼에서 가져온 모든 '메타 데이터'는 닫히기 전에 복사/사용되어야합니다. 여기에 'getMetadataBuffer'가있는 Grep : https://github.com/seanpjanson/140319-Accounts/blob/master/GAC.java가 표시됩니다. Burcu Dogan을 그녀의 데모에서 파고 한 것을 기억합니다.하지만 아무런 반응이 없습니다. – seanpj

-2

폴더의 메타 데이터를 가져올 수 있습니다. 폴더가 없으면 실패합니다.

+0

좋은 생각! 나는 그것을 시도 할 것이다 – Jakob

+0

나는 그것이 일할 것이기를 바란다. 그러나 거기에서 운 없음. 오래 전에 사라진 파일의 모든 메타 데이터를 읽을 수있었습니다. 휴지통처럼 또는 '빈 쓰레기'로 완전히 삭제되었습니다. 그리고 10 시간 전에 '길다'. 나는 웹 인터페이스가 대기 시간/동기화 문제가있는 내부 시스템에 대한 또 다른 플러그라고 생각한다. – 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()"상태를 확인하고 있습니다. 웹에서 '제거'파일은 휴지통으로 이동하기 만합니다. 또한 일반적으로 웹 사이트 (since there is no 'DELETE' in the API)에서 삭제하는 것은 약간 색다른 일입니다. 나는 잠시 동안 테스트를하고 있었고 "isTrashed()"상태가 업데이트되기까지 몇 시간이 걸릴 수 있습니다. Google 드라이브에서 수동으로 휴지통을 비우는 것도 신뢰할 수 없습니다. 이 issue on Github을 참조하십시오.

약간의 more talk here이 있지만 문제와 관련이 없을 수 있습니다.

+0

이 코드는 기존 Google Play 서비스 라이브러리에서 제대로 작동했지만 Google Play 서비스 7.0.0으로 업데이트하면 AbstractPendingResult 클래스에서 충돌합니다 – Harish

+0

"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에서 오랫동안 연구 해 주셔서 감사합니다. (저는 매월 변경한다고 생각합니다). Pls는 https://github.com/seanpjanson/GDAADemo/blob/master/src/main/java/com/andyscan/gdrtdemo/GDAA.java와 같은 smth에 대한 링크를 편집합니다. – CoolMind