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学习基础部分

Android SDK下载作为Gradle Build的一部分

android sdk那里下载

string 获取最后一部分 android 文件下载recycleview item和progressbar RecyclerView.Adapter生命周期 如何取消ctrl+shift加a

Avast 报告称部分廉价 Android 手机被发现预装恶意程序

自定义进度条Android,kotlin