在不使用 DownloadManager 的情况下更新 Android“下载”文件夹

Posted

技术标签:

【中文标题】在不使用 DownloadManager 的情况下更新 Android“下载”文件夹【英文标题】:Updating Android "Downloads" folder without using a DownloadManager 【发布时间】:2016-05-09 03:48:08 【问题描述】:

我目前正在运行 Marshmallow,并且我已将我的应用程序设置为使用以下路径将文件下载到手机的下载文件夹中:

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)

AsyncTask。一切正常,我可以访问下载的文件。

不过,问题在于这些文件只能在手机上使用文件浏览器访问,而不能通过 android 应用程序通过默认的Downloads 文件夹访问。我知道您可以使用 Android DownloadManager 自动执行此操作,但我想保留我当前的 AsyncTask 实现,而不必使用 DownloadManager

我的问题是,有没有一种方法可以简单地“刷新”或“更新”Downloads 文件夹中的内容,以便它们使用 Android 下载应用程序显示?

我也尝试过使用媒体扫描仪 Intent(刷新图库),但据我了解,这不适用于 Marshmellow

activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));

【问题讨论】:

【参考方案1】:

有没有一种方法可以简单地“刷新”或“更新”下载文件夹中的内容,以便它们使用 Android 下载应用程序显示?

下载应用程序仅显示其自己的 ContentProvider 中的内容,而后者又由通过 DownloadManager 下载的内容驱动。它没有显示任何特定的设备上目录的内容,并且ContentProvider 没有记录或支持独立访问。

我也尝试过使用媒体扫描仪 Intent(刷新图库),但据我了解,这不适用于 Marshmellow。

这样,或者使用MediaScannerConnectionscanFile(),将允许查询MediaStore 的应用查看您的文件。这包括 MTP 守护进程; MTP 是桌面操作系统查看 Android 设备外部存储内容的方式。这些都不会直接影响下载应用。

【讨论】:

【参考方案2】:

如果没有 DownloadManager 类,我认为这是不可能的。我在 AsyncTask 中使用以下内容

DownloadManager downloadManager = (DownloadManager)mainActivity.getSystemService(mainActivity.DOWNLOAD_SERVICE);
downloadManager.addCompletedDownload(file.getName(), file.getName(), true, "application/json", file.getAbsolutePath(),file.length(),true);

这将使该文件出现在 6.0 的“下载”应用中,即使该文件是在本地创建的。

【讨论】:

以上是关于在不使用 DownloadManager 的情况下更新 Android“下载”文件夹的主要内容,如果未能解决你的问题,请参考以下文章

DownloadManager IllegalStateException 在 DIRECTORY_DOWNLOADS 中创建下载

Downloadmanager实现app实现的升级下载使用

是否可以取消/停止使用 DownloadManager 开始的下载?

使用 DownloadManager 从 S3 下载 apk 文件

DownloadManager的使用

如何使用 DownloadManager 将下载的文件存储到应用程序分配的文件目录中?