2015-07-11 266 views
11

有沒有辦法使用Android的DownloadManager從S3存儲桶下載文件?使用DownloadManager從S3下載apk文件

我目前可以從Dropbox的這樣一個apk文件:

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 

request.addRequestHeader("Content-Type", "application/vnd.android.package-archive"); 
request.setMimeType("application/vnd.android.package-archive"); 

final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
final long id = manager.enqueue(request); 

現在我想做的事就是我的亞馬遜網址替換「網址」。當我這樣做時,下載只停留在0%,並且只是停留在那裏。

有沒有辦法做到這一點?

順便說一下,我通過的Amazon URL包含AWSAccessKeyId,ExpiresSignature參數。該網址看起來像這樣:

https://bucket-name.s3-us-west-2.amazonaws.com/uploads/app/apk/22/app.apk?AWSAccessKeyId=""&Expires=""&Signature="" 
+0

您是否嘗試過純HTTP而不是HTTPS?您是否嘗試過在您正在測試的設備或模擬器上的Web瀏覽器應用程序中訪問URL?您是否嘗試了一個用於公共資源的URL(即,不需要任何這些查詢參數的URL)?這些只是一些想法,可能會縮小問題的範圍。 – CommonsWare

+0

@CommonsWare我剛剛嘗試了一些你建議的事情。如果我點擊我的S3存儲桶中的文件選項「公開」,下載工作。這消除了參數的需要。所以我假設這個問題與我的AWS憑證相關?儘管使用鏈接中的憑證,該文件在我的計算機上的瀏覽器中下載。 – theDazzler

+0

「所以我假設問題與我的AWS憑證有關?」 - 我從來沒有用'DownloadManager'試過帶查詢參數的網址。我會*認爲''DownloadManager'會支持它。看一下解析過的'Uri'和getQuery()''''''getQueryParameters()'等東西,並確保你的值不會在一路上被擾亂。 – CommonsWare

回答

4

它失敗的原因是因爲您設置了Content-Type標頭。 HTTP頭下載不需要此頭。但是,一旦設置,就必須按照AWS S3的要求,在預先註冊的URL中籤名的一部分。否則你會看到403 Forbidden - SignatureDoesNotMatch錯誤。

快速解決方案是刪除Content-Type標頭。

request.addRequestHeader("Content-Type", "application/vnd.android.package-archive"); 

另一種解決方案是生成一個帶有所需標題的預先設置的URL。假設你真的想設置內容類型,你可以將它添加到GeneratePresignedUrlRequest然後從它創建一個URL。

GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, key); 
request.setContentType("application/vnd.android.package-archive"); 
URL url = s3Client.generatePresignedUrl(request); 

請參閱AmazonS3.generatePresignedUrl(GeneratePresignedUrlRequest)瞭解更多詳情。

+0

哇。感謝這工作。你說這是「快速」解決方案。這個解決方案有什麼問題需要注意?是否有更好的「更長」解決方案?我對您的解決方案沒有任何問題,但只是想知道是否有任何我應該注意的問題。 – theDazzler

+0

查看更新的答案。 – Yangfan

1

你好你可以使用下面的頭來獲取apk文件的請求。

Accept-Encoding:gzip, deflate 
Accept-Language:en-US,en;q=0.8 
Cache-Control:no-cache 
Connection:keep-alive 
Content-Length:819457 
Content-Type:application/octet-stream