2016-06-24 8 views
0

ドライブ内に作成されたフォルダのresourceIdを取得する必要があります。 は私がこのやっているこれらのドキュメントfirstsecond 呼ば:このコードで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 

             }); 
          } 
         } 
        } 
       }); 

を、私は(私は、コードを通してそれを得るとき常にnullである)getResourceId()を除いてresult内のすべての値を取得しています。

私はドライブの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がまだヌルであると言っていますか? – 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) { 
          } 
         }); 

      } 
     };  

Logcat情報:

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

はgetFolderが値下げされていませんか? – Atula

+0

私はあなたが 'result.getDriveFolder()。createFile(...)'を代わりに使うことができると思います – BNK

+1

本当にありがとうございます...それは本当に私のために働いた – Atula

関連する問題