似乎MediaScanner想要扫描我告诉它不要的文件。现在我想知道为什么。
我的应用从我的服务器下载了几个媒体文件,稍后会通过播放列表显示它们。
为此,该应用获取了Android系统DownloadManager的媒体文件。
使用Request.setDestinationUri(),下载内容将保存到名为“待定”的getExternalCacheDir()子目录中。
下载完成后,Android DownloadManager会发送ACTION_DOWNLOAD_COMPLETE广播。然后,我的应用程序的广播监听器将完成下载并将其从“pending”文件夹移动到名为“media”的其他文件夹。
所有这些都按预期工作。
但是,系统日志中包含以下消息:
E/BitmapFactory(23779): Unable to decode stream: java.io.FileNotFoundException: /path/to/pending/image.jpg: open failed: ENOENT (No such file or directory)
E/JHEAD (23779): can't open '/path/to/pending/image.jpg'
E/StagefrightMetadataRetriever(25911): Unable to create data source for '/path/to/pending/video.mp4'.
E/MediaScannerJNI(23779): An error occurred while scanning file '/path/to/pending/video.mp4'.
显然,我的应用程序告诉DownloadManager将图像/视频下载到“待定”目录。它按照它的说法发送并发送“我完成下载”广播。我的应用程序接收广播并将完整文件移动到“媒体”目录。片刻之后,MediaScanner(或其他东西)会尝试将“pending”文件夹中的已完成文件和barfs扫描到系统日志中。
现在我想知道:为什么MediaScanner会尝试读取这些文件呢?
根据setDestinationUri的Android API文档:“MediaScanner不扫描下载的文件。但可以通过调用allowScanningByMediaScanner()来扫描它。”我不知道调用该方法,因此不应扫描下载的文件。
接下来,我尝试在应用的.ignore中添加一个空的cache directory,并通过ACTION_MEDIA_SCANNER_SCAN_FILE向MediaScanner提醒.ignore文件的存在,但错误消息仍然存在。
为了增加神秘感,文件不会出现在系统的图库或视频应用程序中,所以是的,媒体扫描程序会忽略它们。但仍然:为什么它在不需要时会尝试阅读它们?它是MediaScanner还是其他系统服务?
答案 0 :(得分:1)
接下来,我尝试在应用程序的缓存目录中放置一个空的.ignore,并通过ACTION_MEDIA_SCANNER_SCAN_FILE提醒MediaScanner .ignore文件的存在,但错误信息仍然存在。
停止Mediascanner的魔法文件不是“.ignore”而是“.nomedia” 来自MediaScanner.java:
File file = new File(path.substring(0, slashIndex) + ".nomedia");
if (file.exists()) {
// we have a .nomedia in one of the parent directories
return true;
}
它之所以没出现在系统的图库或视频应用程序中的原因可能是因为扫描崩溃了(如日志中所示)。
但是,我对媒体扫描仪也有不好的看法。例如,为什么不以更直接的方式停止扫描。例如,在MediaScanner.java中,而不是
public void scanDirectories(String[] directories, String volumeName) {
[...]
for (int i = 0; i < directories.length; i++) {
processDirectory(directories[i], mClient);
}
可能是
public void scanDirectories(String[] directories, String volumeName) {
[...]
for (int i = 0; i < directories.length; i++) {
if (! isNoMediaPath(directories[i]))
processDirectory(directories[i], mClient);
}
但相反,它一次又一次地在java代码和cpp代码之间反复出现。这是什么原因?
答案 1 :(得分:0)
它看起来真像&#34; .nomedia&#34;不会给出一些人可能期望的效果。在MediaScanner.java中进一步调查之后,我会说,这个文件并不能阻止MediaScanner完全扫描整个树。它仍然为每个文件添加MediaStore的条目,更不用说设置noMedia了。
它只是将MediaStore中的条目标记为&#34;不得显示&#34;。在每个文件上,它执行&#34; beginFile&#34;和#34; endFile&#34;。在endFile中,它始终执行mMediaInserter.insert,无论是哪种方式。
令我烦恼的是,它扫描了所有文件,例如:一个安装的棒,因此冒着陷入病毒的风险(专门为该扫描过程设计),没有.nomedia文件可以阻止它这样做。