如何使Google Drive Java SDK读取/写入" my Drive"而不是别的什么地方?

时间:2014-12-18 07:48:34

标签: java google-drive-api google-api-java-client

我正在使用最新的Java SDK for Google Drive(1.9.0 rev 155),我已设法使其上传文件,列出文件,创建目录(令人惊讶的难度)以及其他各种各样的东西。

但是我上传的内容在Web界面中是不可见的,类似地,Web界面中的内容对我的代码是不可见的。代码是这样的:

public final class Main
{
    private static final String APPLICATION_NAME = "java7-fs-gdrive";
    private static final JsonFactory JSON_FACTORY
        = JacksonFactory.getDefaultInstance();

    private static final Path SECRETS_FILE;

    static {
        final String home = System.getProperty("user.home");
        if (home == null)
            throw new ExceptionInInitializerError("user.home not defined???");
        final Path clientSecrets
            = Paths.get(home, ".gdrive/clientSecrets.json");
        try {
            SECRETS_FILE = clientSecrets.toRealPath();
        } catch (IOException e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    private Main()
    {
        throw new Error("nice try!");
    }

    public static void main(final String... args)
        throws GeneralSecurityException, IOException
    {
        final NetHttpTransport transport
            = GoogleNetHttpTransport.newTrustedTransport();

        final GoogleCredential credential;

        try (
            final InputStream in = Files.newInputStream(SECRETS_FILE);
        ) {
            credential = GoogleCredential.fromStream(in, transport,
                JSON_FACTORY).createScoped(ImmutableList.of(DriveScopes.DRIVE));
        }

        final Drive drive = new Drive.Builder(transport, JSON_FACTORY,
            credential).setApplicationName(APPLICATION_NAME).build();

        final Drive.Files files = drive.files();

        final Drive.Files.List list = files.list();

        final FileList fileList = list.execute();

        final List<File> items = fileList.getItems();

        for (final File item: items) {
            System.out.println(item.getTitle());
            System.out.println(item.getId());
            System.out.println(item.getKind());
        }

    }
}

好的,所以,从开发者控制台,我使用的是“服务帐户”凭证文件。还有“Web应用程序的客户端ID”。经过许多阅读开发者网站的访问(以及SO问题/答案)后,我仍然无法弄清楚两者之间的差异,仍然无法弄清楚如何“在网络用户界面上”修改文件。

那么,我该怎么办?

2 个答案:

答案 0 :(得分:2)

服务帐户您。它是自己的实体,将其视为Google云端硬盘上的用户。它没有Web版本的Google驱动器,因为它不是真正的人,所以没有登录。它确实有自己的驱动器帐户,Google日历和其他一些东西。如果你想能够看到它拥有的文件,我认为有一些选择。

首先将选项上传到您自己的帐户。

转到Google云端硬盘用户界面。创建一个目录。获取服务帐户的电子邮件地址,并像访问任何其他用户一样授予其访问权限。然后运行服务帐户。如果它有效,它应该可以访问这个新目录,然后你可以上传到那个目录。

第二种选择。

让服务帐户授予您访问其目录结构的权限。可能使用Permissions: insert来获取您的电子邮件地址并授予其访问服务帐户目录的权限。

注意我没有使用驱动器对此进行测试,但我已将其用于Google Analytics和Google日历。我可能只是为了它的乐趣而尝试它。另外,我不是Java程序员,因此无法真正帮助它实现它。我真的不认为这是一个Java问题,更多的是服务帐户设置问题:)

答案 1 :(得分:1)

如何使Google Drive Java SDK读取/写入“我的云端硬盘”

正如@DaImTo指出的那样,“服务帐户”不是“我的驱动器”。虽然建议的共享解决方案可能有效,但它(笨拙)笨拙且难以维护。

如果您希望自己的应用能够直接访问“我的云端硬盘”,那么只需要

  1. 获得&amp;为“我的云端硬盘”Google帐户存储刷新令牌,
  2. 只要您需要访问权限,就使用该刷新令牌获取访问令牌,
  3. 最后以通常的方式使用该访问令牌作为Drive API的标头或网址参数。
  4. 此处列出了步骤1 How do I authorise an app (web or installed) without user intervention? (canonical ?)

    第2步是标准的Google Oauth,描述为https://developers.google.com/accounts/docs/OAuth2WebServer#refresh

    第3步是标准云端硬盘,例如https://developers.google.com/drive/v2/reference/files/get#try-it