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

标签 android cloudrail

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

在浏览 Drive API 文档时,它引用了空间,具体定义了 3 个空间:drive、photos 和 allDataFolder。

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

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

当 Google 身份验证页面在移动浏览器中打开时,它表明我的应用想要访问用户的 Google 相册,我授予此访问权限。但是调用CloudRail服务获取 child 时,看不到照片

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


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

最佳答案

在 Cloudrail 人员的帮助/指导下,我已经走上了这条道路并实现了集成。您应该注意,我的集成仅限于从 Google Photos 阅读/下载。我还没有找到任何编写/上传的方法。我也没有找到任何方法来读取可以在 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 中,我使用以下方法获取 inputStream:

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

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

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

希望对您有所帮助。

关于android - 如何使用 CloudRail 指定 Google Drive API 空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44866120/

相关文章:

java - Android-按钮滑动效果

android.app.Application 无法转换为 LifecycleOwner

android - VOIP 通话录音

Android编程及不同版本之间的兼容性

iphone - 您将如何根据运营商重定向移动网页?

android - 上传/下载文件 CloudRail Android/Dropbox

javafx - 在JavaFX中获取选定的树节点项的完整路径

cloudrail - 使用 CloudRail 进行简单下载失败