如何使用DownloadManager暂停下载?

14

我希望实现在下载时用户可以暂停、停止下载的功能。如何使用DownloadManager实现这一功能?


1
我也想知道这个。我尝试使用remove(ids)方法停止下载,如果我们在下载表中检查它,似乎可以工作,但在通知区域仍然显示为正在下载。 - morphium
我所说的下载表格可以通过以下方式访问: Intent i = new Intent(); i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS); startActivity(i); - morphium
我是Android的新手,但我已经使用C++ Qt创建了一个下载管理器。这是我的实现链接,如果你计划自己实现下载管理器,它可能会有所帮助。http://kunalmaemo.blogspot.com/2010/05/simple-download-manager-in-qt-with.html - Kunal
我看过另一个可行的Android下载管理器。 https://dev59.com/D2rXa4cB1Zd3GeqPB7aa#22346459 - AZ_
3个回答

5
你可以从队列中移除一个下载。然后,当把它重新添加到队列时,可以通过传递Range HTTP头来重新启动它(如TryTryAgain所提到的)。我认为目前没有更简单的方法。

1
我尝试了你的想法,但似乎它并没有起作用,或者我漏掉了一些重要的东西。我获取已下载数据的字节,并将文件重命名,以免在执行downloadmanager.remove(referenceId)时被删除。然后创建一个对应的请求request.addRequestHeader("Range", "bytes=" +bytesStored+"-");,再次入队以重新开始下载。你能帮我解决这个问题吗? - Cjames

2
也许对您来说,"暂停"并不是必要的操作?因为DownloadManager实际上无需暂停就能够恢复下载。
相反,您可能遇到了恢复下载时的问题?请尝试以下方法:如何恢复被中断的下载。其中解决方案是实现Range请求头...
// Open connection to URL.
HttpURLConnection connection =
        (HttpURLConnection) url.openConnection();

// Specify what portion of file to download.
connection.setRequestProperty("Range", "bytes=" + downloaded + "-");
// here "downloaded" is the data length already previously downloaded.

// Connect to server.
connection.connect();

除非您确实需要允许“暂停”(因为需要切换文件下载优先级、维护列表或其他更复杂的操作),而不仅仅是提供恢复能力,否则这应该会有所帮助。


1

你是指在Web应用程序中实现这个吗?

我也在考虑同样的事情。这可能可以通过flash或silverlight等方式实现,但在纯HTML中呢?

在服务器端,我们可以使用RandomAccessFileReader(Apache)或类似的FileReader(按字节)来访问文件并写入输出流。我们还可以记住用户上一次会话下载了多少字节。但问题在于没有标准的方法将文件保存到客户端本地文件系统中。您可以在IE中使用ActiveX对象来编写某些文件,前提是它是顺序(纯文本)文件而不是二进制文件(如mp3、flv等)。但这个ActiveX不是解决方案。因此,您可能需要为您的网站设计类似于“下载器”的东西。就像Youtube Downloader一样。


1
我在谈论Android中的DownloadManager API。我想知道DownloadManager是否有关于暂停/恢复的API。 - David Guo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接