2017-07-01 2 views
1

J'écris une application Android pour accéder à Google Photos via le service CloudRail. Je peux m'authentifier auprès du compte Google en question et voir tous mes fichiers/dossiers dans Google Drive, mais je ne peux pas accéder aux photos de Google Photos.Comment spécifier les espaces de l'API Google Drive à l'aide de CloudRail

Tout en parcourant la documentation de Drive API, il fait référence aux espaces, en particulier 3 espaces sont définis: drive, photos et allDataFolder. Où dois-je spécifier les espaces qui m'intéressent? Mais par défaut, l'espace disque est en cours d'accès. Même si, j'ai précisé spécifiquement la portée pour les photos:

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

Et lorsque les pages Google authentification ouvre dans le navigateur mobile, il est dit que mon application veut accéder à Google Photos de l'utilisateur et je lui donnerai cet accès. Mais lorsque vous appelez le service CloudRail pour obtenir les enfants, pas de photos sont visibles

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


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

Répondre

2

Je l'ai déjà été dans cette voie et a réalisé l'intégration - à l'aide/conseils des gens de Cloudrail. Vous devriez noter que mon intégration est limitée à la lecture/téléchargement depuis Google Photos. Je n'ai trouvé aucun moyen d'écrire/télécharger. Je n'ai pas non plus trouvé de moyen de lire la structure de l'album qui peut être configurée dans Google Photos. En premier lieu, vous devez inclure le périmètre pour Google Photos. Je l'ai fait comme suit:

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

Vous devez ensuite construire un Cloudrail advancedRequest pour télécharger toutes les données que vous voulez. Je télécharge les métadonnées Je requiers comme suit:

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

Par la suite dans mon application, j'utiliser Glide pour télécharger les photos elles-mêmes en cas de besoin. Dans le Glide DataFetcher j'obtenir le fluxEntrée en utilisant:

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

Ici « modèle », contient diverses informations associées à chaque photo. Le sourceId vient de l'id "téléchargé":

String source_id = java.io.File.separator + fileObjectMap.get("id"); 

J'espère que cela aide.

+1

merci de fournir une telle solution détaillée au problème. Cela aurait été sympa, bien sûr, si CloudRail avait simplement un argument "spaces" pour l'une de ses fonctions Service/Get. –

+1

Comment obtenez-vous l'URL de l'image à nourrir pour glisser? Y at-il un autre paramètre qui peut être spécifié dans les "fichiers (ID, nom ...)" quelque chose comme le chemin? –

+0

Merci, @GaryKipnis. Ma compréhension de Cloudrail est que les "espaces" sont spécifiques à inclure dans leur code générique et ils ont développé "advancedRequest" comme un moyen de surmonter la limitation. J'ai modifié ma réponse pour couvrir le flux de Glide. –

0

Est-ce que quelqu'un arrivant à cette question/réponse s'il vous plaît noter que, à la mi-janvier 2018, Google a "sunset" (sic) l'espace des photos (espaces = photos ci-dessus). Cela signifie que la solution ci-dessus ne fonctionne plus.

Dans la documentation de l'API Google REST: «L'espace des photos sera désactivé début janvier 2018. Vos utilisateurs peuvent continuer à accéder à Google Photos via l'espace disque en activant le dossier Google Photos dans Mon Drive dans les paramètres du lecteur"

Pouce!