2016-06-24 2 views
0

Мне нужно получить resourceId папки, созданной внутри моего диска. Приглашен эти Документы first и second Я делаю это:получить идентификатор папки для диска Google Диска

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 

             }); 
          } 
         } 
        } 
       }); 

С помощью этого кода я получаю все значения внутри result для getResourceId() (который является нулевым всегда, когда я получаю это через код), за исключением.

Ну, я даже вижу идентификатор моей папки в драйвере.

Уже сделано много исследований, но ни одно из них не дает никакого решения. Они дают только ПРИЧИНЫ.

Есть ли кто-нибудь, кто решил это?

+0

Я не сталкивался с этой конкретной проблемой, хотя я прочитал, где назначение идентификаторов ресурсов может быть отложено. Взгляните на http://stackoverflow.com/questions/22874657/unpredictable-result-of-driveid-getresourceid-in-google-drive-android-api. – Cheticamp

+0

Да, но это не может отложить на целый день, я думаю. – Atula

+0

Единственное место, где я вижу, где вы пытаетесь получить идентификатор ресурса, находится в обратном вызове 'onResult' для создания в папке. Этот вызов будет всегда возникать сразу же после создания папки, поэтому вы можете ожидать задержки в присвоении идентификатора ресурса , поскольку GDAA, вероятно, еще не синхронизировался. Вы говорите, что вы проверяете идентификатор ресурса на 24 часа позже с другим фрагментом кода (не то, что вы отправили), а идентификатор ресурса по-прежнему равен нулю? – Cheticamp

ответ

4

Как ответ @seanpj на Google Drive Android Api Completion Event for Folder Creation, вы можете попробовать, как показано ниже, хотя, возможно, пока это не очень хорошее решение. Надеюсь, поможет!

Внутри <application> из AndroidManifest.xml:

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

      } 
     };  

Logcat информация:

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

не getFolder обесценился? – Atula

+0

Я думаю, что вы можете использовать 'result.getDriveFolder(). CreateFile (...)' вместо – BNK

+1

Большое вам спасибо ... это действительно сработало для меня – Atula

Смежные вопросы