gpt4 book ai didi

android - DownloadManager 在下载后运行 MediaScanner 但不应该

转载 作者:行者123 更新时间:2023-11-29 01:58:53 27 4
gpt4 key购买 nike

似乎 MediaScanner 想要扫描我告诉它不要扫描的文件。现在我想知道为什么。


我的应用程序从我的服务器下载多个媒体文件,稍后用播放列表显示它们。

为此,应用程序使用 Android 系统的 DownloadManager 获取媒体文件。 .

使用 Request.setDestinationUri() , 下载将保存到 getExternalCacheDir() 的子目录中命名为“待定”。

下载完成后,Android DownloadManager 发送ACTION_DOWNLOAD_COMPLETE播送。然后,我的应用程序的广播监听器将完成下载并将其从“待处理”文件夹移动到名为“媒体”的不同文件夹。

所有这些都按预期工作。

但是,系统日志中充满了如下消息:

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() 使其可扫描。” 我没有调用该方法,因此不应扫描下载的文件。 p>

接下来,我试着放一个空的.ignore在应用程序的 cache directory并通过 ACTION_MEDIA_SCANNER_SCAN_FILE 提醒 MediaScanner 忽略文件的存在。 ,但错误消息仍然存在。

更神秘的是,这些文件不会出现在系统的图库或视频应用程序中,所以是的,媒体扫描器会忽略它们。但仍然:为什么它在不需要时尝试阅读它们?是 MediaScanner 还是其他系统服务?

最佳答案

Next, I tried to put an empty .ignore in the app's cache directory and reminded the MediaScanner of the .ignore-file's existence through ACTION_MEDIA_SCANNER_SCAN_FILE, but the error messages remain.

停止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 代码之间来回切换。这是什么原因?

关于android - DownloadManager 在下载后运行 MediaScanner 但不应该,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13726412/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com