簡體   English   中英

如何使Google Drive Java SDK讀取/寫入“我的驅動器”而不是其他地方?

[英]How to make the Google Drive Java SDK read from/write to “my Drive” and not somewhere else?

我正在使用最新的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問題/答案)之后,我仍然無法弄清楚兩者之間的區別,仍然無法弄清楚如何“在網絡UI上”修改文件。

所以我該怎么做?

服務帳戶不是您。 它是自己的實體,將其視為Google雲端硬盤上的用戶。 它沒有Web版本的Google驅動器,因為它不是真正的人,所以沒有登錄。它確實有自己的驅動器帳戶,Google日歷和其他一些東西。 如果你想能夠看到它擁有的文件,我認為有一些選擇。

第一個選項上傳到您自己的帳戶。

轉到Google雲端硬盤用戶界面。 創建一個目錄。 獲取服務帳戶的電子郵件地址,並像訪問任何其他用戶一樣授予其訪問權限。 然后運行服務帳戶。 如果它工作,它應該有權訪問這個新目錄,然后你可以上傳到該目錄。

第二種選擇。

讓服務帳戶授予您訪問其目錄結構的權限。 可能使用權限:通過獲取您的電子郵件地址並允許其訪問服務帳戶目錄來插入。

請注意,我沒有使用驅動器對此進行測試,但我已將其用於Google Analytics和Google日歷。 我可能只是為了它的樂趣而嘗試它。 另外,我不是Java程序員,因此無法真正幫助它實現它。 我真的不認為這是一個Java問題,它更多的是一個服務帳戶設置問題:)

如何使Google Drive Java SDK讀取/寫入“my Drive”

正如@DaImTo指出的那樣,“服務帳戶”不是“我的驅動器”。 雖然建議的共享解決方案可能有效,但它(笨拙)笨拙且難以維護。

如果您希望您的應用能夠直接訪問“我的雲端硬盤”,那么它只需要

  1. 獲取並存儲“my drive”Google帳戶的刷新令牌,
  2. 每當您需要訪問時,使用該刷新令牌來獲取訪問令牌,
  3. 最后以通常的方式使用該訪問令牌作為Drive API的標頭或URL參數。

此處概述了步驟1 如何在沒有用戶干預的情況下授權應用程序(Web或已安裝)? (規范?)

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM