我的应用程序使用DownloadManager从网站下载jpgs并将它们存储在/sdcard/Android/name.app/目录中,以便在应用程序的多个片段中使用。下载效果很好,jpgs在Gallery应用程序中可见,我不想要,因为它们只是我的应用程序的资产。我无法弄清楚如何让它们不显示在Gallery应用程序中。我甚至尝试将.nomedia文件添加到创建它们的目录中。任何帮助,将不胜感激!
DownloadManager myDownloadManager = (DownloadManager) myActivity.getSystemService(Context.DOWNLOAD_SERVICE);
Request myRequest = new Request(Uri.parse(episodeArtLink));
myRequest.setNotificationVisibility(Request.VISIBILITY_HIDDEN);
myRequest.setVisibleInDownloadsUi(false);
myRequest.setDestinationInExternalFilesDir(myActivity, Environment.DIRECTORY_DOWNLOADS, myFilename);
myDownloadManager.enqueue(myRequest);
问题似乎是因为MediaScanner将图像添加到系统数据库,即使我没有要求它。
我创建了一个演示此问题的测试应用。如果您点击“下载”按钮,Google徽标就会显示在应用中。如果您进入图库应用,则还应在名为“下载”的图库中看到Google徽标。如果你去设置 - >应用和清除图库和媒体存储数据后,Google徽标将消失,并且不会再在Gallery中显示,因为该文件位于/ sdcard / Android / data /下,受.nomedia文件保护。您可以访问/sdcard/Android/data/com.example.downloadmanagertest/files/Download/来验证图片是否仍在手机上。即使重新启动后,如果清除“图库和媒体存储数据”,图像也不会显示在图库中。我在Nexus 4和运行4.2.2的Nexus 7上测试了这个。
来源:https://dl.dropboxusercontent.com/u/114414/DownloadManagerTest.zip
答案 0 :(得分:5)
的解决方案强> 的
媒体扫描仪最终会迟早扫描媒体卡中的媒体并将其编入索引。第一个直观的步骤是欺骗扫描仪不知道该文件是媒体文件。这可以通过保存没有扩展名的图像来实现。一个简单的解决方案是将 notkevin 附加到文件名的末尾。简单地:
而不是
myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, Uri.parse(downloadLink).getLastPathSegment());
使用此
String filename = Uri.parse(downloadLink).getLastPathSegment() + "notkevin";
myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, filename);
但是,由于您使用的是DownloadManager(仅供猜测),因此这在您的情况下是不够的。媒体扫描仪以某种方式知道下载的项目以及它是图像并因此对其进行索引的事实。要禁止它,请使用setMimeType
,如下所示:
myRequest.setMimeType("application/octet-stream");
PS:除了将您或我的名字添加到文件名的末尾之外,还有其他方法可以更改扩展名。例如,您可以散列文件名
String filename = hash(Uri.parse(downloadLink).getLastPathSegment());
public String hash(String victim) throws NoSuchAlgorithmException
{
MessageDigest md = MessageDigest.getInstance("SHA1");
md.reset();
byte[] buffer = victim.getBytes();
md.update(buffer);
byte[] digest = md.digest();
StringBuilder hexStr = new StringBuilder();
for (int i = 0; i < digest.length; i++) {
hexStr.append(Integer.toString( ( digest[i] & 0xff ) + 0x100, 16).substring( 1 ));
}
return hexStr.toString();
}
答案 1 :(得分:2)
我已经在同一个问题上待了几天了。我已经尝试了创建hidden directories,using different extensions,将.nomedia
个文件放入root and image directories directories,创建.nomedia
before the download,{的所有组合。 {3}}
不幸的是,这些似乎都不适用于我(在Nexus 4上)。我的理解是,MediaScanner仅在启动手机或安装外部存储时进行重新扫描。在Nexus 4(或任何没有SD卡插槽的设备)中,此安装仅在启动时发生。
但是,使用Android renaming directory (back and forth)下载的文件会立即被扫描(即使它们是Download Manager)并放入图库中。即使您拥有.nomedia
文件,它们仍会在图库中结束。卸载应用程序没有帮助,因为它们仍然缓存了缩略图(您可以通过清除缓存,数据并强制关闭设置中的图库和媒体存储应用程序来删除它们而无需重新启动)。如果您重新启动手机Android重新扫描外部存储,看到有.nomedia
文件,然后将其从图库中删除。
所以这次重启/重新扫描有点解决了这个问题。但是,我们不希望不断要求用户重新启动手机,因此对我有用的是强制Android在成功下载后重新扫描外部存储:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
我从shouldn't回答了类似的问题和Darshan's。
我设置一个广播接收器来监听已完成的Jon,如果它们成功,我发送广播。似乎工作 - 我的应用程序中下载的图像不再出现在图库中。
答案 2 :(得分:1)
您也可以在不更改文件扩展名的情况下,使整个文件夹不受扫描程序的影响。请参阅&#34; .nomedia&#34;文件在此link;
隐藏Media Scanner中的文件
在外部文件目录中包含名为.nomedia的空文件 (注意文件名中的点前缀)。这可以防止媒体扫描 从阅读您的媒体文件,并通过它们提供给其他应用程序 MediaStore内容提供商。但是,如果您的文件是真的 私有的应用程序,您应该将它们保存在app-private目录中。
答案 3 :(得分:0)
用点(/sdcard/Android/name.app/.photos/)作为文件夹名称的前缀。如果这不起作用,请尝试隐藏您的文件夹。
答案 4 :(得分:0)
https://github.com/thest1/LazyList/blob/master/src/com/fedorvlasov/lazylist/ImageLoader.java
在上面的链接中查看名称如getphoto,getbitmap的方法。 LazyLoader github项目提供了使用其他答案中的建议来调整所需的所有方法,以便将媒体从WEB,缓存(内存,文件系统)以及在应用程序中使用位图。
在位图持续存在的文件链接中,只需采用模块可以识别的文件名,但媒体扫描程序无法识别。
应该这样做。