Android部分下载http
Posted
技术标签:
【中文标题】Android部分下载http【英文标题】:Android partial download http 【发布时间】:2016-09-26 11:06:02 【问题描述】:在我的应用程序中,我通过 HTTP 连接从服务器下载媒体。下载时,如果连接中断(例如,没有 n/w,权限撤销),文件将被部分下载。
之前我们删除文件并从头开始下载。
现在,要求发生了变化。我必须从我离开的地方继续(比如在 WhatsApp 中)。
所以我正在做的是检查文件是否存在,如果文件存在则跳过流。请找到以下代码片段。
InputStream is = con.getInputStream();
File file = new File(targetPath);
boolean fileExist = file.exists();
if (fileExist)
long skippedBytes = is.skip(file.length());
// opens an output stream to save into file
OutputStream os = new FileOutputStream(targetPath, fileExist);
它仅在跳过方面起作用,但实际上不起作用。
说,文件(视频)长度为 20 秒,第一次尝试我下载了 6 秒,随后休息。但是当我播放它时,它只播放到 6 秒,然后抛出通常的视频播放错误。
【问题讨论】:
使用InputStream.skip
没有意义...它仍然会被下载但会被跳过...如果服务器支持 Range 标头我宁愿使用它
@Selvin,我知道这不会节省带宽,但应该可以。为了节省带宽,我们需要在服务器端跳过。我正在尝试使用跳过在客户端实现(不用担心带宽)。
如果后端支持,我宁愿使用http头Range
关于“6 秒问题” - 如果应用程序崩溃,以前的文件可能在末尾有一些垃圾字节(可能已损坏)......所以最好有另一个文件(或共享首选项)来存储保存数据的真实计数,这些数据将在您保存块后写入......我宁愿不依赖于文件长度
【参考方案1】:
File file = new File(targetPath);
if (file.exists())
con.setRequestProperty("Range", "bytes=" + (file.length()) + "-");
else
con.setRequestProperty("Range", "bytes=" + 0 + "-");
【讨论】:
以上是关于Android部分下载http的主要内容,如果未能解决你的问题,请参考以下文章
Android SDK下载作为Gradle Build的一部分
string 获取最后一部分 android 文件下载recycleview item和progressbar RecyclerView.Adapter生命周期 如何取消ctrl+shift加a