Android:如何使用ContentProvider通过DownloadManager下载文件到内部存储?

3
我正在尝试使用ContentProvider通过DownloadManager(参见选项2here)将单个巨大的zip文件下载到内部存储,创建一个可供DownloadManager写入的ContentProvider,并给它一个对应的URI。有人能为我提供一个示例以实现这一点吗? this是我要实现的目标吗?或者用这种方法做是否完全错误的想法?
1个回答

4
您发布的答案提到了两种情况:
  1. 如果您使用下载管理器来下载文件,则无论在何处下载,它都将被视为公共下载,并且其他应用程序可以访问它。
  2. 如果您想将其下载到应用程序上下文特定的内部存储器中,则可以通过任何可能的方法进行下载,并按照发帖人的建议使用ContentProvider。

现在进一步补充一下,无论选择哪种方法,下载数据的代码都将保持不变。也许我会建议更适合的解决方案,因为ContentProvider通常用于处理数据库,所以请放弃使用它,而是:

  1. 创建一个服务,这将在后台运行
  2. 通过此服务启动一个线程来下载数据,这非常重要,无论使用哪种方法,但如果尝试在主线程上挂钩任何长时间的网络操作,则Android将关闭您的应用程序,指出网络在主线程或ANR上
  3. 下载完成后,您可以停止服务,并从那里做任何您想做的事情。

以下是下载文件的精彩代码,以及使用电源管理器等的用法:

Download a file with Android, and showing the progress in a ProgressDialog


但是我该如何处理跨多个系统重启的下载,就像DownloadManager一样? - felixd
你可以采用各种机制,比如在偏好设置中设置一个标志,表示最初下载不完整。如果下载成功完成,则将其标记为已下载完成。现在,如果应用程序突然关闭或下载失败,您始终可以通过此偏好设置检查下载状态,然后决定是否重新启动下载服务。 - Techfist
好的,但这是一个大约200MB的文件。如果下载没有完成,有没有一种方法可以恢复它而不是重新开始?这是核心问题。我需要在系统重启后启动服务,但应该是可能的。(请参见此处 - felixd
重新启动服务非常简单,无论是设备重启还是服务突然停止的情况下,您在上面发布的链接中可以找到使服务持久化的详细信息。而这个链接https://dev59.com/iW025IYBdhLWcg3wEhjr将帮助您实现恢复逻辑。 - Techfist
好的。非常感谢!现在我能够解决这个问题了。 - felixd

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