2016-06-24 18 views
0

Ich brauche die ResourceId eines Ordners in meinem Laufwerk erstellt. Geworben diesen docs first und second Ich tue dies:Get Google Drive Folder 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 

             }); 
          } 
         } 
        } 
       }); 

Mit diesem Code, ich bin jeden Wert innerhalb result mit Ausnahme des getResourceId bekommen() (die immer null ist, wenn ich es durch den Code zu bekommen).

Nun, ich kann sogar die ID meines Ordners in der Laufwerks-URL sehen.

Schon viel Forschung getan, aber keine von ihnen gibt noch eine Lösung. Sie geben nur GRÜNDE.

Gibt es jemanden, der das gelöst hat?

+0

Ich habe dieses spezielle Problem nicht kennengelernt, obwohl ich gelesen habe, wo die Zuweisung von Ressourcen-IDs verzögert werden kann. Sehen Sie sich http://stackoverflow.com/questions/22874657/unpredictable-result-of-driveid-getresourceid-in-google-drive-android-api an. – Cheticamp

+0

ja, aber es kann nicht einen ganzen Tag verzögern, denke ich. – Atula

+0

Der einzige Ort, den ich sehe, wo Sie versuchen, die Ressource ID zu bekommen, ist in der 'OnResult' Callback für die Erstellung des Ordners. Dieser Aufruf wird immer unmittelbar nach dem Erstellen des Ordners ausgeführt, sodass Sie möglicherweise eine Verzögerung in der Zuweisung einer Ressourcen-ID erwarten, da GDAA wahrscheinlich noch nicht synchronisiert wurde. Sagen Sie, dass Sie die Ressourcen-ID den Ordner 24 Stunden später mit einem anderen Stück Code (nicht, was Sie gepostet haben) überprüfen und die Ressourcen-ID immer noch null ist? – Cheticamp

Antwort

4

Als die Antwort von @seanpj um Google Drive Android Api Completion Event for Folder Creation, können Sie versuchen, wie unten, obwohl es vielleicht nicht eine sehr schöne Lösung für jetzt ist. Ich hoffe es hilft!

Innen <application> von 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()); 
    } 
} 

Innen 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 Info:

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

ist nicht getFolder abgeschrieben? – Atula

+0

Ich denke, Sie können 'result.getDriveFolder(). CreateFile (...)' statt – BNK

+1

Vielen Dank ... es hat wirklich funktioniert für mich – Atula