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.
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. –
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? –
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. –