【发布时间】: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 秒问题” - 如果应用程序崩溃,以前的文件可能在末尾有一些垃圾字节(可能已损坏)......所以最好有另一个文件(或共享首选项)来存储保存数据的真实计数,这些数据将在您保存块后写入......我宁愿不依赖于文件长度
标签: android https download partial