2017-07-01 4 views
1

Ich schreibe eine Android App, um über den CloudRail-Dienst auf Google Drive Photos zuzugreifen. Ich kann mich bei dem betreffenden Google-Konto authentifizieren und alle meine Dateien/Ordner in Google Drive sehen. Ich kann jedoch nicht auf Fotos von Google Fotos zugreifen.So legen Sie Google Drive API-Bereiche mithilfe von CloudRail fest

Beim Durchsuchen der Drive API-Dokumentation wird ein Verweis auf Leerzeichen erstellt, insbesondere sind drei Leerzeichen definiert: Laufwerk, Fotos und allDataFolder.

Wo gebe ich die Bereiche an, an denen ich interessiert bin? Aber standardmäßig wird auf den Laufwerksspeicher zugegriffen. Auch wenn ich angegeben speziell Raum für Fotos:

https://www.googleapis.com/auth/drive.photos.readonly 

Und wenn Google-Authentifizierung Seiten im mobilen Browser geöffnet wird, heißt es, dass meine App von Google Zugriff auf die Benutzer Fotos gewinnen will, und das gebe ich diesen Zugang. Aber wenn CloudRail Dienst rufen Kinder zu bekommen, sind keine Fotos sichtbar

`googledriveChildren = mGoogledriveService.getChildren("/"); // returns goole drive top level files/folders 


`googledriveChildren = mGoogledriveService.getChildren("/photos"); // generates a NotFoundException 

Antwort

2

ich schon auf diesem Weg war und erreichte die Integration - mit Hilfe/Anleitung von den Leuten bei Cloudrail. Sie sollten beachten, dass meine Integration auf das Lesen/Herunterladen von Google Fotos beschränkt ist. Ich habe keine Möglichkeit zum Schreiben/Hochladen gefunden. Ich habe auch keine Möglichkeit gefunden, die Albumstruktur zu lesen, die in Google Fotos eingerichtet werden kann.

Zunächst müssen Sie den Bereich für Google Fotos einschließen. Ich tat dies wie folgt:

public static final String GOOGLE_PHOTOS_SCOPE = "https://www.googleapis.com/auth/drive.photos.readonly"; 

private final AtomicReference<CloudStorage> googlephotos = new AtomicReference<>(); 


    List<String> scope = new ArrayList<>(); 
    scope.add(My_Constants.GOOGLE_PHOTOS_SCOPE); 
    googlephotos.set(new GoogleDrive(context, google_client_id, "", Get.GetString(R.string.google_redirect_uri), 
      Get.GetString(R.string.google_authentication_state), scope)); 
    ((GoogleDrive) googlephotos.get()).useAdvancedAuthentication(); 

Sie dann eine Cloudrail advancedRequest aufbauen müssen herunterladen alle Daten, die Sie wollen. Ich lade die erforderlichen Metadaten wie folgt herunter:

CloudStrorage service = googlephotos.get(); 

    private void searchForGooglePhotos(final CloudStorage service) throws Throwable { 
    GoogleDrive google_drive = (GoogleDrive) service; 
    boolean more = true; 
    String pageToken = null; 
    while (more) { 
     StringBuilder builder = new StringBuilder(); 
     String query = URLEncoder.encode("mimeType='image/jpeg' and trashed = false", "utf-8"); 
     builder.append("/files?spaces=photos"); 
     if (pageToken != null) { 
      builder.append("&pageToken="); 
      builder.append(pageToken); 
     } 
     builder.append("&q="); 
     builder.append(query); 
     builder.append("&fields=nextPageToken,files(id,name,modifiedTime,description,size," + 
       "imageMediaMetadata(height,rotation,width,time))"); 
     AdvancedRequestSpecification specification = new AdvancedRequestSpecification(builder.toString()); 
     AdvancedRequestResponse response = google_drive.advancedRequest(specification); 
     @SuppressWarnings("unchecked") 
     Map<String, Object> resultObjectMap = (Map<String, Object>) response.getBodyJsonParsed(); 
     pageToken = (String) resultObjectMap.get("nextPageToken"); 
     @SuppressWarnings("unchecked") 
     ArrayList<Map<String, Object>> filesObjectMap = ((ArrayList<Map<String, Object>>) resultObjectMap.get("files")); 
     for (Map<String, Object> fileObjectMap : filesObjectMap) { 
      // process downloaded files 
     } 
     more = (pageToken != null); 
    } 
} 

Anschließend verwende ich Glide, um die Fotos bei Bedarf selbst herunterzuladen. Im Glide DataFetcher erhalte ich das input mit:

if (model.getSourceRecord().isTypeGooglePhotos()) { 
     AdvancedRequestSpecification specification; 
     AdvancedRequestResponse response; 
     if (model.getIsThumbnail()) { 
      specification = new AdvancedRequestSpecification("/files" + model.getSourceId() + 
        "?spaces=photos&fields=thumbnailLink"); 
      response = ((GoogleDrive) service).advancedRequest(specification); 
      @SuppressWarnings("unchecked") 
      Map<String, Object> parsed = (Map<String, Object>) response.getBodyJsonParsed(); 
      String link = (String) parsed.get("thumbnailLink"); 
      specification = new AdvancedRequestSpecification(link); 
      specification.disableBaseUrl(); 
     } else { 
      specification = new AdvancedRequestSpecification("/files" + model.getSourceId() + "?spaces=photos&alt=media"); 
     } 
     response = ((GoogleDrive) service).advancedRequest(specification); 
     input_stream = response.getBodyAsStream(); 
    } else { 
     if (model.getIsThumbnail()) { 
      input_stream = service.getThumbnail(model.getSourceId()); 
     } else { 
      input_stream = service.download(model.getSourceId()); 
     } 
    } 

Hier „Modell“ enthält verschiedene Informationen zu jedem Foto zugeordnet. Die sourceId stammt von der "ID" heruntergeladen:

Ich hoffe, das hilft.

+1

danke für die Bereitstellung einer solchen detaillierten Lösung für das Problem. Wäre schön gewesen, wenn CloudRail einfach ein "Leerzeichen" -Argument zu einer ihrer Service/Get-Funktionen gehabt hätte. –

+1

Wie erhalten Sie die tatsächliche Bild-URL, um gleiten zu können? Gibt es einen anderen Parameter, der in den "files (id, name ...)" etwas wie Pfad angegeben werden kann? –

+0

Danke, @GaryKipnis. Mein Verständnis von Cloudrail ist, dass die "Räume" spezifisch sind, um in ihren generischen Code aufgenommen zu werden, und sie haben "advancedRequest" entwickelt, um die Beschränkung zu überwinden. Ich habe meine Antwort bearbeitet, um den Feed zu Glide abzudecken. –

0

Würde jemand zu dieser Frage/Antwort kommen bitte beachten Sie, dass ab Mitte Januar 2018, Google "Sonnenuntergang" (sic) die Fotos Raum (Leerzeichen = Fotos oben) haben. Dies bedeutet, dass die obige Lösung nicht mehr funktioniert. In der Google REST-API-Dokumentation: "Der Speicherplatz für Fotos wird Anfang Januar 2018 freigeschaltet. Ihre Nutzer können weiterhin über den Speicherplatz auf Google Fotos zugreifen, indem sie den Google Fotos-Ordner unter" Meine Drive "in den Einstellungen für den Drive-Client aktivieren"

Ugh!

Verwandte Themen