I used Android Drive Api to upload my files on Drive.I created a folder("NewFolder") on Google Drive root and created a inner folder("InnerFolder") inside my "NewFolder" from android app using following code.Then I write my files on this "InnerFolder" from my android app.
My app create the "InnerFolder" on first time installation on my device only.Then uninstall and reinstall App will not created folder again(Stored created folder Drive Id(like DriveId:yrjundeen12cnfe) in local file).
My Code works fine on first time Installation.But If I uninstall and reinstall app many times and I try to upload on Google Drive,I got error as "Invalid parent folder" on callback method of createFile.
First Time Folder Creation code:
private void createGalleryFolder() {
DriveFolder folder = Drive.DriveApi.getRootFolder(googleApiClient);
MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
.setTitle(AppConstants.DEFAULT_GALLERY_NAME).build();
folder.createFolder(googleApiClient, changeSet).setResultCallback(
createRootFolderCallback);
}
final ResultCallback<DriveFolderResult> createRootFolderCallback = new ResultCallback<DriveFolderResult>() {
@Override
public void onResult(DriveFolderResult result) {
if (!result.getStatus().isSuccess()) {
showError();
return;
}
// Root folder created Successfully
DriveId mFolderDriveId = result.getDriveFolder().getDriveId();
AppUtilities.saveOnLocalFile(mFolderDriveId, AppConstants.ROOT_FOLDER_ID_FILE);
if (!deviceID.equalsIgnoreCase("")) {
DriveFolder folder = Drive.DriveApi.getFolder(googleApiClient,
result.getDriveFolder().getDriveId());
MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
.setTitle(deviceID).build();
folder.createFolder(googleApiClient, changeSet)
.setResultCallback(createInnerFolderCallback);
} else {
showError(); }
}
};
final ResultCallback<DriveFolderResult> createInnerFolderCallback = new ResultCallback<DriveFolderResult>() {
@Override
public void onResult(DriveFolderResult result) {
if (!result.getStatus().isSuccess()) {
showError();
return;
}
// IMEI folder created successfully inside the Root folder
DriveId mFolderDriveId = result.getDriveFolder().getDriveId();
AppUtilities.saveOnLocalFile(mFolderDriveId, AppConstants.INNER_FOLDER_ID_FILE);
// Success
}
};
File Upload code:
private void saveFileToDrive(final Bitmap bitmapToSave,final File imageFile,final String imageName) {
Drive.DriveApi.newDriveContents(googleApiClient).setResultCallback(driveContentsCallback);
}
final private ResultCallback<DriveContentsResult> driveContentsCallback =
new ResultCallback<DriveContentsResult>() {
@Override
public void onResult(DriveContentsResult result) {
if(!result.getStatus().isSuccess()){
Log.i("Test1", "Failed to create new contents");
return;
}
Log.i("Test1", "New contents created");
//Write image data to OutputStream
OutputStream outputStream = result.getDriveContents().getOutputStream();
ByteArrayOutputStream bitmapStream = new ByteArrayOutputStream();
bitmapToSave.compress(Bitmap.CompressFormat.JPEG, 100, bitmapStream);
try {
outputStream.write(bitmapStream.toByteArray());
DriveFolder folder = Drive.DriveApi.getFolder(googleApiClient, DriveId.decodeFromString(getFolderDriveID()));
MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
.setTitle(imageName)
.setMimeType("image/jpeg")
.setStarred(false).build();
folder.createFile(googleApiClient, changeSet, result.getDriveContents()).setResultCallback(fileCallback);
} catch (IOException e) {
Log.i("Test1","Unable to write file contents");
}
}
};
final private ResultCallback<DriveFileResult> fileCallback =
new ResultCallback<DriveFileResult>() {
@Override
public void onResult(DriveFileResult result) {
if (!result.getStatus().isSuccess()) {
Log.i("Test1","Error while trying to create the file "+result.getStatus().getStatusMessage());
return;
}
Log.i("Test1","Created a file: " + result.getDriveFile().getDriveId());
result.getDriveFile().getMetadata(googleApiClient).setResultCallback(fileUploadedResultCallback);
}
};
final private ResultCallback<MetadataResult> fileUploadedResultCallback =
new ResultCallback<MetadataResult>() {
@Override
public void onResult(MetadataResult result) {
if(!result.getStatus().isSuccess()){
Log.i("Test1", "Failed to upload");
return;
}
Log.i("Test1", "File uploaded");
}
};
Error on ResultCallback:
D/dalvikvm( 584): threadid=50: interp stack at 0x549a5000
D/dalvikvm( 584): threadid=50: calling run()
I/Test1 ( 813): Image added
--------- beginning of /dev/log/system
D/ActivityThread( 584): SVC-CREATE_SERVICE handled : 0 / CreateServiceData{token=android.os.BinderProxy@415dbf40 className=com.google.android.gms.drive.api.DriveAsyncService packageName=com.google.android.gms intent=null}
D/ActivityThread( 584): SVC-Calling onStartCommand: com.google.android.gms.drive.api.DriveAsyncService@415b6480, flags=2, startId=1
D/ActivityThread( 584): SVC-SERVICE_ARGS handled : 0 / ServiceArgsData{token=android.os.BinderProxy@415dbf40 startId=1 args=Intent { act=com.google.android.gms.drive.EXECUTE pkg=com.google.android.gms }}
W/DataServiceConnectionImpl( 584): Could not find entry, and no valid resource id: DriveId:CAESABgGIMq7nNDgUg==
E/DriveAsyncService( 584): Invalid parent folder.
E/DriveAsyncService( 584): OperationException[Status{statusCode=Invalid parent folder., resolution=null}]
E/DriveAsyncService( 584): at com.google.android.gms.drive.api.e.e(SourceFile:619)
E/DriveAsyncService( 584): at com.google.android.gms.drive.api.e.a(SourceFile:458)
E/DriveAsyncService( 584): at com.google.android.gms.drive.api.a.n.a(SourceFile:82)
E/DriveAsyncService( 584): at com.google.android.gms.drive.api.a.b.a(SourceFile:27)
E/DriveAsyncService( 584): at com.google.android.gms.common.service.c.onHandleIntent(SourceFile:60)
E/DriveAsyncService( 584): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
E/DriveAsyncService( 584): at android.os.Handler.dispatchMessage(Handler.java:99)
E/DriveAsyncService( 584): at android.os.Looper.loop(Looper.java:154)
E/DriveAsyncService( 584): at android.os.HandlerThread.run(HandlerThread.java:65)
I/Test1 ( 813): Error while trying to create the file Invalid parent folder.