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