0

I need to get the resourceId of a folder created inside my drive. Referred these docs first and second I am doing this :

 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

                                        });
                            }
                        }
                    }
                });

With this code, I am getting every value inside result except for the getResourceId()( which is null always when I get it through code).

Well I can even see my folder's id in drive url.

Already done a lot of research but none of them give any solution yet.They are giving only REASONS.

Is there anyone who have solved this ?

Atula
  • 2,177
  • 2
  • 12
  • 28
  • I have not run into this particular problem, although I have read where the assignment of resource ids can be delayed. Take a look at http://stackoverflow.com/questions/22874657/unpredictable-result-of-driveid-getresourceid-in-google-drive-android-api. – Cheticamp Jun 24 '16 at 12:12
  • yeah but it can't delayed for a whole day I guess. – Atula Jun 24 '16 at 12:15
  • The only place I see where you are trying to get the resource id is in the `onResult` callback for the creation of the folder. This call will always occur immediately after creation of the folder, so you might expect a delay in assignment of a resource id since GDAA probably hasn't synced yet. Are you saying that you check the resource id of the folder 24 hours later with another piece of code (not what you posted) and the resource id is still null? – Cheticamp Jun 24 '16 at 12:45
  • i have put the driveId in shared Pref and get them again but still null. Even tried a thread after interval – Atula Jun 24 '16 at 12:55
  • Please read http://stackoverflow.com/questions/34318220/google-drive-android-api-completion-event-for-folder-creation – BNK Jun 25 '16 at 05:53
  • Thanks @BNK, I have seen that before but I couldn't figure out how to implement it. If you know please share. – Atula Jun 25 '16 at 05:56
  • Ok, please wait :) – BNK Jun 25 '16 at 06:04

1 Answers1

4

As the answer of @seanpj at Google Drive Android Api Completion Event for Folder Creation, you can try as below although perhaps it's not a very nice solution for now.

Inside <application> of 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());
    }
}

Inside 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
halfer
  • 19,824
  • 17
  • 99
  • 186
BNK
  • 23,994
  • 8
  • 77
  • 87
  • isn't getFolder depreciated ? – Atula Jun 25 '16 at 06:20
  • I think you can use `result.getDriveFolder().createFile(...)` instead – BNK Jun 25 '16 at 06:31
  • can you tell me one thing how to get empty Folder's resourceId. – Atula Jun 25 '16 at 07:02
  • Unfortunately, I have not found a solution for empty folder, you can try this question http://stackoverflow.com/questions/37089745/getting-result-getdrivefolder-getdriveid-getresourceid-always-null – BNK Jun 25 '16 at 07:05