2013-02-24 66 views
11

我正在開發一個Android項目,我正在嘗試使用Google Drive API,並且我已經獲得了大部分它工作,但我在如何執行下載時遇到問題。如何獲取文件ID,以便我可以從Android上的Google Drive API執行文件下載

我無法找到任何地方我如何獲取文件ID,以便我可以執行下載。爲了測試,我檢索了我的驅動器帳戶中的所有文件,並將它們添加到列表數組中,然後獲得列表中第一個文件的ID。

然後我將文件ID複製到下載文件的命令中,並且這個工作成功,但我不知道如何獲得我想要下載的特定文件的文件ID。

下面是我用來下載文件的代碼。

private void downloadFile() 
{ 
    Thread thread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      try 
      { 
       com.google.api.services.drive.model.File file = service.files().get("0B-Iak7O9SfIpYk9zTjZvY2xreVU").execute(); 
       //FileList file = service.files().list().execute(); 
       //List<com.google.api.services.drive.model.File> fileList = file.getItems(); 
       //com.google.api.services.drive.model.File fileItem = fileList.get(0); 
       //Log.d("FileID" , fileItem.getId()); 
       //Log.d("Count", "Retreived file list"); 
       if (file.getDownloadUrl() != null && file.getDownloadUrl().length() > 0) 
       { 
        HttpResponse resp = service.getRequestFactory().buildGetRequest(new GenericUrl(file.getDownloadUrl())).execute(); 
        InputStream inputStream = resp.getContent(); 
        writeToFile(inputStream); 
       } 
      } 
      catch (IOException e) 
      { 
       Log.e("WriteToFile", e.toString()); 
       e.printStackTrace(); 
      } 
     } 
    }); 
    thread.start(); 
} 

0B-Iak7O9SfIpYk9zTjZvY2xreVU是我下載的文件時,我做了一個列表,選擇的第一個文件,我檢索到的文件ID,但我怎麼能說我想下載,File_1並獲得其ID來話通這個給service.get()。execute函數。

基本上我的最終目標是在我的應用程序中,我將一個XML文件上傳到Google Drive,然後再下載文件。它只會是一個文件,並且將始終具有相同的名稱。我是否立即着手或者有更好的方法來實現我正在嘗試做的事情。

我希望這是有道理的,任何幫助將不勝感激。

感謝

回答

2

嗯,我能想到的第一個選擇是,你可以用search parameters發送list的要求爲您的文件,像title="File_1.xml" and fileExtension="xml"。它會返回一個空的文件列表(沒有一個匹配serach條件),或者返回一個至少包含一個文件的列表。如果只有一個 - 很簡單。但是如果還有更多 - 你必須根據其他一些領域選擇其中的一個。請記住,在gdrive中,您可以擁有多個具有相同名稱的文件。所以你提供的搜索參數越多越好。

+0

感謝您的幫助,這似乎是很多工作,告訴android獲取所有文件的列表,然後遍歷所有文件,找到我想要的文件,以便我可以獲得ID。期望只提供一個文件名,並檢索該ID。謝謝,雖然我會試試 – Boardy 2013-02-25 13:33:06

+0

你實際上並沒有告訴android來做它,而是谷歌的服務器。通過這種方式,他們的服務器正在完成您的工作(從(可能很長的)文件列表中篩選正確的文件)。另外,通過網絡傳輸的數據更少。 – stan0 2013-02-25 13:42:35

+0

是的,我看到你的觀點,只是看起來很慢,很長時間囉嗦,當我列表找到文件ID是爲我的測試,在問題中提到它花了幾秒鐘完成,我不是那麼過分我的雲端硬盤帳戶中有大量文件 – Boardy 2013-02-25 18:22:57

1

Stan0初衷不是一個好主意。可以有多個具有相同名稱的文件。非常容易出錯的實現。 Stan0的第二個想法是正確的方法。

當你第一次將文件上傳到Google雲端硬盤存儲其ID(在SharedPreferences是可能比較容易),供以後使用

即。

file= mDrive.files().insert(body).execute();  //initial insert of file to google drive 

whereverYouWantToStoreIt= file.getId(); //now you have the guaranteed unique id 
             //of the file just inserted. Store it and use it 
             //whenever you need to fetch this file 
1

如果知道該文件的名稱,如果你總是想要下載特定文件,那麼你就可以輕鬆獲得ID和其他屬性從你想要的檔案:https://developers.google.com/drive/v2/reference/files/list(朝向底部,你會找到一種運行查詢的方式)。在q字段中輸入title ='your_file_name'並運行它。你應該看到一些結果顯示在下面,它應該是一個「ID」字段。這是你正在尋找的身份證。

您也可以玩與其他參數:https://developers.google.com/drive/search-parameters

2

該腳本記錄在驅動所有的文件名和ID:

// Log the name and id of every file in the user's Drive 
function listFiles() { 
    var files = DriveApp.getFiles(); 
    while (files.hasNext()) { 
    var file = files.next(); 
    Logger.log(file.getName() + ' ' + file.getId()); 
    } 
} 

此外,「Files: list」的頁面在一個表格列出驅動器中所有文件的元數據的結尾,可用於需要但少數ID的情況。

3

一種方法是在創建時將獨特的屬性與您的文件相關聯。

properties = "{ \ 
    key='somekey' and \ 
    value='somevalue' 
}" 

然後創建一個查詢。

query = "title = " + "\'" + title + "\'" + \ 
     AND + "mimeType = " + "\'" + mimeType + "\'" + \ 
     AND + "trashed = false" + \ 
     AND + "properties has " + properties 

已知的所有文件屬性(標題等)可以在這裏+屬性。

0

對於我的觀點,獲取Google雲端硬盤文件ID的最簡單快捷的方法是從Google Drive網絡中,右鍵單擊文件,然後單擊獲取共享鏈接。鏈接的最後部分是文件ID。然後你可以取消分享。

相關問題