I am working on Google Drive Api. I want to download images from Google drive. Below is the code which is working but the files.open() is called when the loop finishes. Suppose the count is 3, the loop will complete looping first and after that files.open() will be called 3 times. Because of this I am not able to set the data in my model class. It takes only last value. (Edited)
if (getGoogleApiClient() != null && getGoogleApiClient().isConnected()) {
try {
final DriveFolder pFldr = Drive.DriveApi.getRootFolder(getGoogleApiClient());
pFldr.listChildren(getGoogleApiClient()).setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
@Override
public void onResult(DriveApi.MetadataBufferResult metadataBufferResult) {
int count = metadataBufferResult.getMetadataBuffer().getCount();
Log.e("COUNT---", count + "");
MetadataBuffer buffer = metadataBufferResult.getMetadataBuffer();
if (count > 0) {
for (int i = 0; i < count; i++) {
if (buffer.get(i).getMimeType().equals("image/jpeg")) {
Log.e("Images avaialbe - ", "" + buffer.get(i).getTitle());
DriveId id = buffer.get(i).getDriveId();
DriveFile files = Drive.DriveApi.getFile(getGoogleApiClient(), id);
driveModel.setTitle(buffer.get(i).getTitle());
files.open(getGoogleApiClient(), DriveFile.MODE_READ_ONLY, null).setResultCallback(saveImageCallback);
}
if (buffer.get(i).getMimeType().equals("application/x-sqlite3")) {
DriveId id = buffer.get(i).getDriveId();
DriveFile files = Drive.DriveApi.getFile(getGoogleApiClient(), id);
files.open(getGoogleApiClient(), DriveFile.MODE_READ_ONLY, null).setResultCallback(saveDataBaseCallback);
}
}
buffer.release();
showMessage("Success");
} else {
showMessage("No Back Up available.");
}
}
});
} finally {
}
}
ResultCallback<DriveApi.DriveContentsResult> saveImageCallback = new ResultCallback<DriveApi.DriveContentsResult>() {
@Override
public void onResult(DriveApi.DriveContentsResult driveContentsResult) {
DriveContents cont = driveContentsResult.getDriveContents();
InputStream inputStream = cont.getInputStream();
try {
saveFiles(inputStream, driveModel.getTitle(), false);
cont.discard(getGoogleApiClient());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Try this:
1.) Change to ArrayList<DriveModel> driveFileList;
2.)
pFldr.listChildren
(getGoogleApiClient())
.setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
@Override
public void onResult(DriveApi.MetadataBufferResult metadataBufferResult) {
int count = metadataBufferResult.getMetadataBuffer().getCount();
Log.e("COUNT---", count + "");
Log.e("CHECk" , "Calling callback read from googledrive");
MetadataBuffer buffer = metadataBufferResult.getMetadataBuffer();
if (count > 0) {
for (int i = 0; i < count; i++) {
final int finalI = i;
Log.e("CHECk" , "reading file " + buffer.get(i).getTitle());
Log.e("Files avaialbe - ", "" + buffer.get(i).getTitle());
driveModel=new DriveModel();
DriveId id = buffer.get(i).getDriveId();
DriveFile files = Drive.DriveApi.getFile(getGoogleApiClient(), id);
if (buffer.get(i).getMimeType().equals("image/jpeg") ||
buffer.get(i).getMimeType().equals("image/png")) {
driveModel.setTitle(buffer.get(i).getTitle());
Log.e("Images avaialbe - ", "" + buffer.get(i).getTitle());
// driveModel.setTitle(buffer.get(i).getTitle());
files.open(getGoogleApiClient(), DriveFile.MODE_READ_ONLY, null)
.setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
@Override
public void onResult(@NonNull DriveApi.DriveContentsResult driveContentsResult) {
saveData(driveContentsResult, finalI);
}
});
driveFileList.add(driveModel);
}
if (buffer.get(i).getMimeType().equals("application/x-sqlite3")) {
files.open(getGoogleApiClient(), DriveFile.MODE_READ_ONLY, null)
.setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
@Override
public void onResult(@NonNull DriveApi.DriveContentsResult driveContentsResult) {
saveData(driveContentsResult, finalI);
}
});
}
}
buffer.release();
showMessage("Success");
} else {
showMessage("No Back Up available.");
}
}
}
);
3.) create the method :
private void saveData(DriveApi.DriveContentsResult driveContentsResult, int i) {
Log.e("CHECk" , "Calling callback " + driveContentsResult.getDriveContents().getDriveId().encodeToString() );
DriveContents cont = driveContentsResult.getDriveContents();
Log.e("File name :" , "File : " + driveFileList.get(i).getTitle());
//Put your code here
InputStream inputStream = cont.getInputStream();
try {
saveFiles(inputStream, true);
cont.discard(getGoogleApiClient());
} catch (IOException e) {
e.printStackTrace();
}
}