使用DownloadManager从S3下载apk文件
有没有办法使用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
,Expires
和Signature
参数。该网址看起来像这样:
https://bucket-name.s3-us-west-2.amazonaws.com/uploads/app/apk/22/app.apk?AWSAccessKeyId=""&Expires=""&Signature=""
它失败的原因是因为您设置了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)了解更多详情。
哇。感谢这工作。你说这是“快速”解决方案。这个解决方案有什么问题需要注意?是否有更好的“更长”解决方案?我对您的解决方案没有任何问题,但只是想知道是否有任何我应该注意的问题。 – theDazzler
查看更新的答案。 – Yangfan
你好你可以使用下面的头来获取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
您是否尝试过纯HTTP而不是HTTPS?您是否尝试过在您正在测试的设备或模拟器上的Web浏览器应用程序中访问URL?您是否尝试了一个用于公共资源的URL(即,不需要任何这些查询参数的URL)?这些只是一些想法,可能会缩小问题的范围。 – CommonsWare
@CommonsWare我刚刚尝试了一些你建议的事情。如果我点击我的S3存储桶中的文件选项“公开”,下载工作。这消除了参数的需要。所以我假设这个问题与我的AWS凭证相关?尽管使用链接中的凭证,该文件在我的计算机上的浏览器中下载。 – theDazzler
“所以我假设问题与我的AWS凭证有关?” - 我从来没有用'DownloadManager'试过带查询参数的网址。我会*认为''DownloadManager'会支持它。看一下解析过的'Uri'和getQuery()''''''getQueryParameters()'等东西,并确保你的值不会在一路上被扰乱。 – CommonsWare