2016-12-24 1 views
2

Ich arbeite an Google Drive API. Ich möchte Bilder von Google Drive herunterladen. Unten ist der Code, der funktioniert, aber die files.open() wird aufgerufen, wenn die Schleife beendet ist. Angenommen, die Zählung ist 3, wird die Schleife zuerst abgeschlossen und danach wird files.open() dreimal aufgerufen. Aus diesem Grund kann ich die Daten in meiner Modellklasse nicht festlegen. Es braucht nur den letzten Wert. (Edited)Ergebnis Rückruf in Schleife (Laden Sie mehrere Bilder von Google Drive.)

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

Wo ist der Haken für die erste 'Versuch-fangen'? –

+0

@ GürtuğGüngör, es ist ein Versuch-endlich, es gibt keinen Haken. –

+0

@ OleV.V., Entschuldigung, ich wurde es versehentlich während der Bearbeitung gelöscht, wenn ich meine bearbeitete Version sehe, habe ich es nicht gesehen und schrieb die Frage. –

Antwort

1

Try this: 1.) Wechsel zur 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.) die Methode erstellen:

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

java.lang.IndexOutOfBoundsException für driveFileList.get (i) .getTitle(); –

+0

würden Sie fehlen driveFileList.add (driveModel); in Ihren if-Bedingungen .. Ich habe nicht für die Anwendung/x-sqlite3-Anweisung versucht. –

+0

setzen Sie einige Validierungen, wenn Sie den Dateinamen für "application/x-sqlite3" nicht hinzufügen möchten –

Verwandte Themen