Erro inválido na pasta pai da API do Android Drive
Usei o Android Drive Api para carregar meus arquivos no Drive.Eu criei uma pasta ("NewFolder") na raiz do Google Drive e criei uma pasta interna ("InnerFolder") dentro do meu "NewFolder" do aplicativo Android usando o código a seguir. meus arquivos neste "InnerFolder" do meu aplicativo para Android.
Meu aplicativo cria o "InnerFolder" na instalação inicial apenas no meu dispositivo. Em seguida, a desinstalação e a reinstalação do aplicativo não criarão a pasta novamente (ID da unidade da pasta criada armazenada (como DriveId: yrjundeen12cnfe) no arquivo local).
Meu código funciona bem na primeira instalação. Mas se eu desinstalar e reinstalar o aplicativo várias vezes e tentar fazer upload no Google Drive, ocorreu um erro como "Pasta pai inválida" no método de retorno de chamada createFile.
Código de criação da primeira pasta:
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
}
};
Código de upload de arquivo:
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");
}
};
Erro no 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.