2013年7月26日 星期五

用 Eclipse Java 開發 Google Drive API (基本範例)

主程式:Eclipse  (我是用Indigo版 3.7)
Eclipse外掛:使用 Eclipse 專用的 Google 外掛程式 (最好參考這裡Google Plugin for Eclipse)
程式碼範例:Quickstart: Run a Drive App in Java

首先先建置Eclipse的環境  (建議不要用中文外掛  問題多多)

先到 Help ==> Install New Software

點Add

Name 隨便打  打你看得懂的就好
Location 輸入外掛的網址
外掛的網址請依照你的Eclipse版本  Google Plugin for Eclipse 輸入
在按OK
我是點這三個
在下載安裝的時候  可能會發生錯誤  可以不用理他
安裝完成後  Eclipse 要重開


你會看到你的Eclipse工具列上多了Google的按鈕  (沒看到請回應我  我忘記我是怎麼弄的)

好了...  Eclipse的環境建置好了

新建Java project

程式碼如下   (怕以後原始網頁會改  在此紀錄我所使用的範例)
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class DriveCommandLine {

  private static String CLIENT_ID = "YOUR_CLIENT_ID";
  private static String CLIENT_SECRET = "YOUR_CLIENT_SECRET";

  private static String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
  
  public static void main(String[] args) throws IOException {
    HttpTransport httpTransport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();
   
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE))
        .setAccessType("online")
        .setApprovalPrompt("auto").build();
    
    String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build();
    System.out.println("Please open the following URL in your browser then type the authorization code:");
    System.out.println("  " + url);
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String code = br.readLine();
    
    GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute();
    GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response);
    
    //Create a new authorized API client
    Drive service = new Drive.Builder(httpTransport, jsonFactory, credential).build();

    //Insert a file  
    File body = new File();
    body.setTitle("My document");
    body.setDescription("A test document");
    body.setMimeType("text/plain");
    
    java.io.File fileContent = new java.io.File("document.txt");
    FileContent mediaContent = new FileContent("text/plain", fileContent);

    File file = service.files().insert(body, mediaContent).execute();
    System.out.println("File ID: " + file.getId());
  }
}
請依照請況修改你的Class Name

你會發現你import的部分  有一堆找不到lib的部分

這時候請點工具列的Google按鈕
點Add Google APIs

找Drive API在按Finish  (我是用v2版)
完後  你會看到妳的project底下另外多了Drive API的Lib
再回去看程式碼import的部分
紅底線就會不見了  因為有正確匯入的Google API的JAR

接下來要在自己的帳戶開啟API權限
點Services裡面找Drive API  把她打開
再點API Access ==> Create an OAuth 2.0 client ID
Application type裡面 選Installed application
Installed application 裡選Other
再點Create Client ID


會有類似這樣的東西
對應範例程式碼裡面"CLIENT_ID"跟"CLIENT_SECRET"
照上面紅色箭頭修改

範例程式碼最下面有一段
"java.io.File fileContent = new java.io.File("document.txt");"
這個就是要上傳的檔案
例如C:\document.txt就改成"C:\\document.txt"
這樣程式可以Run了

這個範例會在雲端硬碟的根目錄建立一個"My document"的檔案其內容就是document.txt的內容

17 則留言:

  1. 我想請問一下,我照這個範例去跑,不過他會要我輸入"認證碼"在CONSOLE上,不過我是要上傳檔案到GOOGLE DRIVE上,而且我在網址列上也沒看到#Code=......,我想問說你有遇過這樣的問題嗎??

    回覆刪除
    回覆
    1. 抱歉 這麼久才回你

      你應該是指"Please open the following URL in your browser then type the authorization code:"這個吧??
      我沒記錯的話,第一次執行會給你網址、取授權碼

      刪除
  2. 你好 不好意思是新手
    以上全部照做後 最後放資料地方出現紅色毛毛蟲
    (|這裡面就是出現紅色毛毛蟲|)
    我應該怎麼修改呢??有點急謝謝





    //Insert a file
    File body = |new File()|;
    body.|setTitle|("My document");
    body.|setDescription|("A test document");
    body.|setMimeType|("text/plain");

    java.io.File fileContent = new java.io.File("document.txt");
    FileContent mediaContent = new FileContent("text/plain", fileContent);

    File file = service.files().|insert|(body, mediaContent).execute();
    System.out.println("File ID: " + file.|getId|());

    回覆刪除
    回覆
    1. 不知道你怎麼弄的....
      我實際上操作一遍是沒你說的這樣....
      我自己測試過沒問題才會發表這篇 (原先是我自己紀錄 後來也沒有實作上的應用 ^^")
      我自己的File 是引用"com.google.api.services.drive.model.File"
      要不 你API再從新加入試試看

      會有你說的紅線 是因為"它沒有這個成員"

      PS:之前的範例 已經被我砍了
      在回覆同時 我自己在做一次 也沒你說的問題

      刪除
  3. 請問一下
    程式執行了之後
    是否會自動生成My document這個資料夾

    回覆刪除
  4. 會產生document.txt
    不會產生資料夾

    回覆刪除
    回覆
    1. 謝謝~

      那能否讓Eclipse讀到電腦本地的雲端硬碟資料夾
      就是可以讓Eclipse存取資料夾的檔案

      刪除
    2. 上面那個 我回錯
      以這個範例是會讀document.txt這個檔案內容 寫入"My document"裡面

      "那能否讓Eclipse讀到電腦本地的雲端硬碟資料夾
      就是可以讓Eclipse存取資料夾的檔案"

      你的意思是要讀取電腦的本機檔案嗎??
      以這個文的主題來思考 我不太了解你的意思...
      這個是以Google Drive API為基礎
      因為我並沒看過Google Drive API裡 有存取本機檔案的相關範例
      就算有 也是引用java.io的程式庫裡

      如果是單純的存取檔案 你可以搜尋看看java內建的程式庫
      我想開啟讀取寫入 它應該是標準程式庫 相信你應該找的到!!

      主要我發這個主題 也是順便做個紀錄
      那時 關於Google Drive API 並沒有相關中文教學

      刪除
  5. 你好

    我的意思是因為Google雲端硬碟安裝完成後
    會在電腦本端產生一個資料夾

    那如果要更新Google雲端硬碟的資料
    是不是可以直接丟資料進這個資料夾

    因為我想用一個Android程式來存取這個Google雲端硬碟裡面的資料
    所以我的想法是說產生的這個My document資料夾
    是否可以跟Eclipse來做連結

    以上
    謝謝

    回覆刪除
    回覆
    1. 那就是用檔案管理的方式
      跟Google Drive API完全沒關係

      嚴格說 你的方式"並不是Eclipse去連結"
      你只是對本機電腦進行檔案管理 由"雲端硬碟"應用程式來同步
      這樣子也是一個方法 但就跟本文的Google Drive API就離題了

      而且他並不是只有JAVA的範例 也有python等等...
      我要是在linux上 用python來寫
      我還只是用nano去寫 依你的概念來思考 我不就是用nano去連結嗎?? (nano是命令列模式下的文字編輯器)

      請你概念先搞清楚 對你而後"程式設計"上會有很大的幫助!!

      刪除
  6. 您好
    我按照步驟操作,在
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
    httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE))
    .setAccessType("online")
    .setApprovalPrompt("auto").build();

    的Arrays.asList(DriveScopes.DRIVE) ,這邊的.asList出現"The method asList(T[]) in the type Arrays is not applicable for the arguments "這個error

    網路上找了一些文章仍無法解決,
    因此像在這邊請教,謝謝!

    回覆刪除
    回覆
    1. 不清楚你引用了那些程式庫

      我剛剛試了eclipse Luna Service Release 2 (4.4.2)
      是可以正確編譯

      不然你把DriveScopes.DRIVE 直接丟"https://www.googleapis.com/auth/drive"這個字串進去
      意思是一樣的

      DriveScopes.DRIVE是引用com.google.api.services.drive.DriveScopes

      刪除
  7. 作者已經移除這則留言。

    回覆刪除
  8. 請問現在"CLIENT_ID"跟"CLIENT_SECRET"去哪找呢?

    我已經有開啟Drive api的服務了

    進到 API管理員 -> 憑證

    我只有看到 金鑰 和 用戶端ID 而已哪?

    回覆刪除
    回覆
    1. 他有改網頁了 跟我之前寫這篇文不同
      我是用"OAuth 2.0 用戶端 ID"

      刪除
  9. 您好 請問Eclipse工具列上多了Google的按鈕這邊
    我重開都沒有顯示
    請問您還記得是怎麼解決的麻

    回覆刪除