0

应用程序 1:我下载了一个文件DownloadManager

应用程序 2:我要求DownloadManager所有下载。我只得到我自己的发起,而不是来自App 1.

下载的文件有Uricontent://downloads/my_downloads/id

来自“应用程序 2”:我无法使用 this设置ImageUria 。(我得到一个)ImageViewContent UriFileNotFoundException

现在我的问题是:如果我打开Android Downloads App并单击从App 1. 我可以使用系统上的任何图片查看器查看它。为什么不从 with App 2

这是因为使用了IntentAction_VIEW)吗?还是我错过了什么?

编辑:

显然,您可以content://downloads/all_downloads/<some_id>从任何其他应用程序获取文件。有没有办法限制应用程序访问这个文件?那么只有发起下载的app才能打开呢?

我在用着:

Request lRequest = new Request(Uri.parse(lDownloadUrl));
lRequest.setNotificationVisibility(Request.VISIBILITY_HIDDEN);
lRequest.setVisibleInDownloadsUi(false);

DownloadManager lDownloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE); 
long lEnqueueId = lDownloadManager.enqueue(lRequest);   
4

1 回答 1

0

下载内容与查看内容不同。因此,文件 X 的下载是由应用程序 A 发起的这一事实并不意味着应用程序 A 能够查看它。如果您希望您的应用程序用于显示它,您应该添加<intent-filter>以便应用程序 A 可以显示在适用的查看器列表中。如果您希望您的应用程序成为显式查看器,则必须使用一些技巧,例如使用唯一的文件扩展名(并在您的<intent-filter>.

编辑

如果您查看 DownloadManager 的源代码,您会注意到下载相关字段的访问权限仅限于所有者。因此,应用程序 A 只能看到它自己开始的这些下载,而对应用程序 B 来说什么也看不到(并且最终,一旦下载到即 SDCard 目标,这些文件是“世界可读的”,这无关紧要)。这也解释了为什么应用程序 B 无法尝试通过使用内容提供程序来访问应用程序 A 的下载 - 根本没有您尝试引用的下载属于应用程序 B(这些是应用程序 B)。所以最后,如果你想“共享”下载,你必须以任何其他方式将下载相关数据传递给应用程序 B,而不是使用 DownloadManager(即用所有数据填充 Bundle 并将其传递给 B)。

于 2012-10-30T13:36:06.673 回答