2016-05-15 242 views
0

我只是無法管理從谷歌驅動器下載文件,我剛剛創建。我可以獲得webContentLink。如果我通過瀏覽器訪問此文件,我可以下載文件,但是我無法通過我的應用程序下載相同的文件...我幾乎閱讀了有關谷歌驅動器的所有文檔,但我找不到任何方式將文件下載到我的存儲。使用google-api-services-drive從谷歌驅動器下載文件:v3

在這裏,我得到的鏈接文件...我能得到我想要的東西永遠是這樣

downloadLink = m.getAlternateLink(); 
downloadLink = m.getEmbedLink(); 
downloadLink = m.getWebContentLink(); 
downloadLink = m.getWebViewLink(); 

或類似驅動器Id所有其他參數...

這裏是我的代碼來獲得它的驅動器上的文件的信息:

Query query2 = new Query.Builder() 
    .addFilter(Filters.and(Filters.eq(
    SearchableField.TITLE, "locations.csv"), 
    Filters.eq(SearchableField.TRASHED, false))) 
           .build(); 
    Drive.DriveApi.query(mGoogleApiClient, query2) 
    .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() { 
    @Override 
    public void onResult(DriveApi.MetadataBufferResult result) { 
     if (!result.getStatus().isSuccess()) { 
     System.out.println("File does not exists"); 
      } else { 
      for(Metadata m : result.getMetadataBuffer()) { 
      if (m.getTitle().equals("locations.csv")) { 
       downloadLink = m.getWebContentLink(); 
       } 
      } 
     } 
     } 
    }); 

在這個文件夾中,只有一個文件,我確信。所以我只需要一種方法將這個文件下載到SD卡或更好的特定文件夾中。

歡迎任何幫助!謝謝。

我的解決方案

在點擊代碼中的某處

driveFileMy.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null) 
        .setResultCallback(contentsOpenedCallback); 

那麼我這樣做:

final private ResultCallback<DriveApi.DriveContentsResult> contentsOpenedCallback = 
     new ResultCallback<DriveApi.DriveContentsResult>() { 
      @Override 
      public void onResult(DriveApi.DriveContentsResult result) { 
       if (!result.getStatus().isSuccess()) { 
        // display an error saying file can't be opened 
        return; 
       } 
       // DriveContents object contains pointers 
       // to the actual byte stream 
       DriveContents contents = result.getDriveContents(); 
       InputStream inputStream = contents.getInputStream(); 
       OutputStream out = null; 
       try { 
        out = new FileOutputStream(filelocation); 
        byte[] buffer = new byte[1024]; 
        int read; 
        while ((read = inputStream.read(buffer)) != -1) { 
         out.write(buffer, 0, read); 
        } 

        out.flush(); 
        inputStream.close(); 
        out.close(); 

       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 

字符串filelocation是輸出文件,它應該的位置保存。感謝大家 :)!

+0

如果您的downloadLink有一個鏈接,您可以通過瀏覽器下載鏈接,它不僅打開與InputStream的鏈接並將內容保存在SD卡中? – jonathanrz

回答

1

Drive API具有full guide on working with file contents,即獲得文件的直接InputStream

給出一個DriveFile,你

DriveFile file = ... 
file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null) 
    .setResultCallback(contentsOpenedCallback); 

打開它使用ResultCallback,看起來像:

ResultCallback<DriveContentsResult> contentsOpenedCallback = 
    new ResultCallback<DriveContentsResult>() { 
    @Override 
    public void onResult(DriveContentsResult result) { 
    if (!result.getStatus().isSuccess()) { 
     // display an error saying file can't be opened 
     return; 
    } 
    // DriveContents object contains pointers 
    // to the actual byte stream 
    DriveContents contents = result.getDriveContents(); 
    } 
}; 

您可以從InputStream通過contents.getInputStream()然後讀,寫出來給本地文件,如果你想。

請記住,自谷歌驅動已經保持一個本地副本一旦你打開一個文件,如果你只需要你的應用程序中的內容,最好是使用InputStream,而不是直接將其保存到尚未另一個本地文件(加倍所需的存儲空間)。

+0

我的不好,我怎麼會錯過這個部分...從來沒有與InputStream合作過,但我會試圖找出它。我需要特定文件夾中的本地副本,以便我的應用可以訪問它。謝謝,我會發佈一個代碼,如果我會得到它的工作。 – Wladislaw

+0

您的應用程序已經在訪問每個字節對應的'InputStream',但是沒關係。祝你好運! – ianhanniballake

相關問題