如何使用 CloudRail 指定 Google Drive API 空间



我正在编写一个Android应用程序,通过CloudRail服务访问Google Drive Photos。我可以对相关 Google 帐户进行身份验证,并在 Google 云端硬盘中查看我的所有文件/文件夹,但我无法访问 Google 相册中的照片。

在浏览云端硬盘 API 文档时,它会引用空格,特别是定义了 3 个空格:驱动器、照片和所有数据文件夹。

我在哪里指定我感兴趣的空间?但默认情况下,正在访问驱动器空间。尽管如此,我还是特别指定了照片的范围:

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

当Google身份验证页面在移动浏览器中打开时,它会指出我的应用想要访问用户的Google相册,并且我授予了此访问权限。但是当调用CloudRail服务来接孩子时,看不到照片

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

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

我已经走上了这条道路并实现了集成 - 在 Cloudrail 人员的帮助/指导下。您应该注意,我的集成仅限于从Google相册读取/下载。我没有找到任何编写/上传的方法。我也没有找到任何可以在Google相册中设置的相册结构的阅读方法。

首先,您需要包括Google相册的范围。我这样做如下:

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

然后,您需要构建一个Cloudrail advancedRequest来下载所需的任何数据。我下载了我需要的元数据,如下所示:

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

随后,在我的应用程序中,我在需要时使用Glide自行下载照片。在 Glide DataFetcher 中,我使用以下方法获取输入流:

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

在这里,"模型"包含与每张照片相关的各种信息。源 ID 来自下载的 "id":

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

我希望这有所帮助。

有人会得到这个问题/回答,请注意,截至2018年1月中旬,谷歌有"日落"(原文如此(照片空间(上面的空间=照片(。这意味着上述解决方案不再有效。

在Google REST API文档中:"照片空间将于2018年1月初日落。您的用户可以通过在云端硬盘客户端设置中启用"我的云端硬盘"中的"Google 相册"文件夹,继续通过云端硬盘空间访问 Google 相册。

呸!

最新更新