2016-06-24 3 views
0

내 드라이브에서 생성 된 폴더의 resourceId를 가져와야합니다. 이 코드Google 드라이브 폴더의 ResourceID 가져 오기

private void CreateFolderOnGoogleDrive() { 
    Query query = new Query.Builder() 
      .addFilter(Filters.and(Filters.eq(
          SearchableField.TITLE, "Folder"), 
        Filters.eq(SearchableField.TRASHED, false))) 
      .build(); 
    Drive.DriveApi.query(mGoogleApiClient, query) 
      .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() { 
       @Override 
       public void onResult(DriveApi.MetadataBufferResult result) { 
        if (!result.getStatus().isSuccess()) { 
         System.out.println("Cannot create folder in the root."); 
        } else { 
         boolean isFound = false; 
         for (Metadata m : result.getMetadataBuffer()) { 
          if (m.getTitle().equals("Folder")) { 
           Toast.makeText(getApplicationContext(), "folder exist", Toast.LENGTH_LONG).show(); 
           isFound = true; 
           break; 
          } 
         } 
         if (!isFound) { 
          System.out.println("Folder not found; creating it."); 
          MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
            .setTitle("Folder") 
            .build(); 
          Drive.DriveApi.getRootFolder(mGoogleApiClient) 
            .createFolder(mGoogleApiClient, changeSet) 
            .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() { 
             @Override 
             public void onResult(DriveFolder.DriveFolderResult result) { 
              if (!result.getStatus().isSuccess()) { 
               System.out.println("Error while trying to create the folder"); 
              } else { 
               System.out.println("Created a folder"); 
}             
              } 
               System.out.println(result.getDriveFolder().getDriveId().getResourceId()); 
// ALWAYS return as null 

             }); 
          } 
         } 
        } 
       }); 

, 나는 (내가 코드를 통해 그것을 얻을 때 항상 널)을 getResourceId()을 제외하고 result 내부의 모든 값을 얻고있다 : 내가이 일을하고이 문서를 firstsecond 을 언급했다.

글쎄, 드라이브 URL에서 내 폴더의 ID를 볼 수도 있습니다.

이미 많은 연구를 해보았지만 아무도 아직 해결책을 제시하지 못했습니다. 그들은 단지 이유를 제시하고 있습니다.

이 문제를 해결 한 사람이 있습니까?

+0

리소스 ID 할당이 지연 될 수있는 곳을 읽었지만이 특정 문제가 발생하지 않았습니다. http://stackoverflow.com/questions/22874657/unpredictable-result-of-driveid-getresourceid-in-google-drive-android-api를 살펴보십시오. – Cheticamp

+0

네,하지만 하루 종일 지연 될 수는 없습니다. – Atula

+0

리소스 ID를 얻으려는 곳을 볼 수있는 유일한 곳은 폴더의 생성을위한'onResult' 콜백에 있습니다. 이 호출은 폴더 생성 직후에 항상 발생하므로 GDAA가 아직 동기화하지 않았으므로 리소스 ID가 지연 될 것으로 예상 할 수 있습니다. 당신은 의 리소스 ID를 24 시간 후에 코드의 다른 부분 (게시 한 내용이 아닌)과 리소스 ID가 여전히 null인지 확인 하시겠습니까? – Cheticamp

답변

4

@seanpj의 대답은 Google Drive Android Api Completion Event for Folder Creation입니다.하지만 지금은별로 좋은 해결책은 아니지만 아래처럼 시도해 볼 수 있습니다. 희망이 도움이됩니다!

내부의 AndroidManifest.xml의 <application> :

<service android:name=".MyDriveEventService" android:exported="true"> 
    <intent-filter> 
     <action android:name="com.google.android.gms.drive.events.HANDLE_EVENT"/> 
    </intent-filter> 
</service> 

MyDriveEventService.java :

public class MyDriveEventService extends DriveEventService { 
    ... 
    @Override 
    public void onCompletion(CompletionEvent completionEvent) {    
     DriveId driveId = completionEvent.getDriveId(); 
     Log.d(TAG, "File ResourceId: " + driveId.getResourceId()); 
     DriveId folderDriveId = MainActivity.getParentID(driveId); 
     if (folderDriveId != null && folderDriveId.getResourceId() != null) 
      Log.d(TAG, "Folder ResourceId: " + folderDriveId.getResourceId()); 
    } 
} 

내부 MainActivity.java :

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
      .setTitle("NewFolder").build(); 
    Drive.DriveApi.getRootFolder(mGoogleApiClient).createFolder(
      mGoogleApiClient, changeSet).setResultCallback(folderCreatedCallback); 
} 

public static DriveId getParentID(DriveId driveId) { 
    MetadataBuffer mdb = null; 
    DriveApi.MetadataBufferResult mbRslt = driveId.asDriveResource().listParents(mGoogleApiClient).await(); 
    if (mbRslt.getStatus().isSuccess()) try { 
     mdb = mbRslt.getMetadataBuffer(); 
     if (mdb.getCount() > 0) 
      return mdb.get(0).getDriveId(); 
    } catch (Exception e) { e.printStackTrace();} 
    finally { 
     if (mdb != null) mdb.close(); 
    } 
    return null; 
} 

private final ResultCallback<DriveFolder.DriveFolderResult> folderCreatedCallback = new 
     ResultCallback<DriveFolder.DriveFolderResult>() { 
      @Override 
      public void onResult(DriveFolder.DriveFolderResult result) { 
       if (!result.getStatus().isSuccess()) { 
        Log.e(TAG, "Error while trying to create the folder"); 
        return; 
       } 

       Log.i(TAG, "Created a folder: " + result.getDriveFolder().getDriveId()); 
       Log.i(TAG, "Folder Resource Id: " + result.getDriveFolder().getDriveId().getResourceId()); // null 

       // Creating an empty file 
       MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
         .setTitle("New file") 
         .setMimeType("text/plain").build(); 
       result.getDriveFolder().createFile(mGoogleApiClient, changeSet, null /* DriveContents */, new ExecutionOptions.Builder() 
           .setNotifyOnCompletion(true) 
           .build()) 
         .setResultCallback(new ResultCallback<DriveFolder.DriveFileResult>() { 
          @Override 
          public void onResult(@NonNull DriveFolder.DriveFileResult driveFileResult) { 
          } 
         }); 

      } 
     };  

로그 캣 정보 :

File ResourceId: 0B0sy1Vw2EUQINkdJRUR2R0puVDg 
Folder ResourceId: 0B0sy1Vw2EUQIV3F2Zzl6RUdBdms 
+0

getFolder가 가치가 있지 않습니까? – Atula

+0

당신이'result.getDriveFolder(). createFile (...)'대신에 – BNK

+1

고맙습니다. 정말 저에게 도움이되었습니다. – Atula