2013-05-06 59 views
5

我的应用程序使用DownloadManager从网站下载jpgs,并将它们存储在/sdcard/Android/name.app/目录中,以便在应用程序中的多个片段中使用。然而,下载的效果很好,jpgs在Gallery应用程序中是可见的,我不想要,因为它们只是我的应用程序的资源。我无法弄清楚如何让它们不会出现在Gallery应用程序中。我甚至尝试添加.nomedia文件到它们被创建的目录。任何帮助,将不胜感激!防止媒体扫描器扫描JPG下载Android上的DownloadManager? (开发人员)

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徽标将显示在应用程序中。如果您进入Gallery应用,您还应该在名为“下载”的图库中看到Google徽标。如果您转到设置 - >应用并清除图库和媒体存储的数据,那么Google徽标将消失,并且不会再显示在图库中,因为该文件位于/ sdcard/Android/data /下,受到.nomedia文件。您可以前往/sdcard/Android/data/com.example.downloadmanagertest/files/Download/以确认图像仍在电话中。即使重新启动后,如果您清除“图库和媒体存储数据”,图像也不会显示在图库中。我已经在运行4.2.2的Nexus 4和Nexus 7上测试了这一点。

来源:以点(/sdcard/Android/name.app/.photos/)https://dl.dropboxusercontent.com/u/114414/DownloadManagerTest.zip

+0

我认为这个问题应该更“通用”。当我安装TomTom时,我遇到了类似的问题:我的画廊中出现了数千个图标!有没有办法从画廊中完成“隐藏”文件夹? – AndreaCi 2013-05-06 08:06:54

+0

这不是针对我下载的应用程序,而是针对我正在开发的应用程序。我不希望下载应用程序的所有人都必须自行寻找解决方法。 – notkevin 2013-05-06 14:47:07

+0

您是否尝试将图像下载到不包含媒体文件的文件夹(名称为.nomedia的文件)?此文件必须阻止扫描文件夹中的文件。 – 2013-05-08 14:43:13

回答

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); 

但是,由于您使用的下载管理器(只是猜测),这是不是你的情况就足够了。媒体扫描器以某种方式知道下载的项目以及它是一个图像的事实,并因此将其编入索引。要禁止它,使用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

谢谢!看来你的解决方案解决了这个问题。我最终将文件保存到设备而没有.jpg扩展名。 – notkevin 2013-05-09 15:43:39

0

前缀的文件夹名称。如果这不起作用,请尝试隐藏您的文件夹。

+0

我已经尝试将文件下载到像.photos这样的目录,但仍然无法正常工作。即使我没有设置allowScanningByMediaScanner(),DownloadManager仍在将文件添加到MediaScanner中。如果我删除了媒体存储应用程序的存储空间,则不会再找到这些图像。如何防止MediaScanner在下载图像时看到图像? – notkevin 2013-05-06 22:48:37

0

https://github.com/thest1/LazyList/blob/master/src/com/fedorvlasov/lazylist/ImageLoader.java

来看看有像getphoto,getbitmap在上面的链接名称的方法。LazyLoader github项目提供了使用其他答案中的建议来将所有媒体从WEB,缓存(内存,文件系统)以及根据需要在您的应用中使用位图所需的所有方法。

在位图持续存在的文件链中,只需使用fileNames,它将被模块识别为需要,但媒体扫描程序不能识别。

应该这样做。

2

我几天来一直在这个相同的问题。我已经尝试过几乎所有创建hidden directories,using different extensions,将.nomedia文件放入root and image directories directories,创建.nomediabefore the download,renaming directory (back and forth)的所有组合。

不幸的是,这些似乎都没有为我工作(在Nexus 4上)。我的理解是,只有在启动手机或安装外部存储设备时,MediaScanner才会进行重新扫描。在Nexus 4(或没有SD卡插槽的任何设备)中,此安装仅在启动时发生。

但是,立即扫描与Android Download Manager一起下载的文件(即使它们是shouldn't),并将其放入图库中。即使您拥有.nomedia文件,它们仍然会在图库中结束。卸载应用程序并没有帮助,因为他们的缩略图仍然被缓存(您可以通过清除缓存,数据和强制关闭设置中的图库和媒体存储应用程序来重新启动而删除它们)。如果您重新启动手机,Android会重新扫描外部存储,请看到有一个.nomedia文件,然后将其从相册中删除。

所以这个重新启动/重新扫描有点解决了这个问题。但是,我们并不希望被不断要求用户重新启动手机这样反而什么工作对我来说是给力的Android与下载成功后,重新扫描外部存储:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

这是我从Darshan's答案到了一个类似的问题和Jon

我设置了一个广播接收机来收听已完成的downloads,如果他们成功我发送广播。似乎工作 - 在我的应用程序下载的图像不再出现在画廊。

0

您也可以让您的整个文件夹不受扫描仪触摸,而无需更改文件扩展名。请参考link中的“.nomedia”文件;

从媒体扫描仪

隐藏文件包括您的外部文件的目录 名为.nomedia一个空文件(注意文件名中的点前缀)。这样可以防止媒体扫描器 读取媒体文件并通过MediaStore内容提供商向 提供给其他应用程序。但是,如果您的文件真的是您的应用程序专用的 ,则应将其保存在应用程序专用目录中。