首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用CloudRail指定Google Drive API空间

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

Stack Overflow用户
提问于 2017-07-02 07:05:17
回答 2查看 318关注 0票数 1

我正在编写一个安卓应用程序访问谷歌驾驶照片通过CloudRail服务。我可以通过相关的Google帐户进行身份验证,并可以在Google Drive中查看我的所有文件/文件夹,但无法访问Google Photos中的照片。

在浏览drive API文档时,它引用了空间,特别是定义了3个空间:驱动器、照片和allDataFolder。

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

代码语言:javascript
复制
https://www.googleapis.com/auth/drive.photos.readonly

当Google Authentication pages在移动浏览器中打开时,它会声明我的应用程序想要访问用户的Google Photos,我授予了此访问权限。但是当调用CloudRail服务获取孩子时,看不到任何照片

代码语言:javascript
复制
`googledriveChildren = mGoogledriveService.getChildren("/"); // returns goole drive top level files/folders


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

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-02 18:21:54

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

首先,您需要包含Google Photos的范围。我是这样做的:

代码语言:javascript
复制
 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来下载您想要的任何数据。我下载所需的元数据如下:

代码语言:javascript
复制
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中,我使用以下命令获取inputStream:

代码语言:javascript
复制
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());
        }
    }

在这里,"model“包含与每张照片相关的各种信息。sourceId来自下载的id:

代码语言:javascript
复制
String source_id = java.io.File.separator + fileObjectMap.get("id");

我希望这能帮到你。

票数 2
EN

Stack Overflow用户

发布于 2018-01-20 20:42:51

回答这个问题的人请注意,截至2018年1月中旬,谷歌已经有了“日落”(原文如此)的照片空间(spaces=photos )。这意味着上面的解决方案不再有效。

在Google REST API文档中:“照片空间将在2018年1月初日落。您的用户可以继续通过驱动器空间访问Google photos,方法是在drive客户端设置中启用My Drive中的Google Photos文件夹。”

啊!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44866120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档