Search code examples
javaandroidcallbackgoogle-drive-android-api

Result callback in loop (Download multiple images from google drive.)


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

Solution

  • 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();
                }
            }