如何将下载管理器与存储访问框架/媒体存储一起使用

问题描述

我需要下载一个 pdf 文件,然后触发一个意图,以便其他合适的应用程序可以显示文件。到目前为止,我使用 setDestinationInExternalPublicDir of DownloadManager 将我的下载目的地设置为下载目录的子目录。然后我使用 getExternalStoragePublicDirectory 创建文件并通过 FileProvider 获取 uri 并最终使用 ACTION_VIEW 触发意图。

现在使用范围存储,getExternalStoragePublicDirectory 已弃用。我打算使用 SAF/MediaStore,但它们提供了内容 uri,我无法使用它来设置 DownloadManager 中的下载目的地。有没有办法解决这个问题?我想将可以通过 DownloadManager.getUriForDownloadedFile 获得的内容 uri 存储在共享首选项中,然后使用它来触发意图而无需 getExternalStoragePublicDirectory。但是,如果有在范围存储合规性限制内使用 DownloadManager 的兼容方式,我想避免此类“黑客”。

解决方法

然后我使用 getExternalStoragePublicDirectory 创建文件并通过 FileProvider 获取 uri 并最终使用 ACTION_VIEW 触发了意图。

没有。那不是要走的路。

相反,您应该为 ACTION_DOWNLOAD_COMPLETE 注册一个广播接收器。

在 onReceive() 中,您可以获得下载文件的 uri。

将该 uri 与您的意图 ACTION_VIEW 的授予读取权限标志一起使用。