当前位置: 首页 > 知识库问答 >
问题:

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

端木安国
2023-03-14

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

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

为此,该应用程序通过Android系统的DownloadManager获取媒体文件。

使用请求。setDestinationUri(),下载将保存到名为“挂起”的getExternalCacheDir()的子目录中。

下载完成后,Android DownloadManager 会发送ACTION_DOWNLOAD_COMPLETE广播。然后,我的应用的广播侦听器将获取已完成的下载,并将其从“挂起”文件夹移动到名为“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'.

显然,我的应用程序告诉下载管理器将图像/视频下载到“挂起”目录。它会按照指示执行,并发送“我已完成下载”广播。我的应用程序接收广播并将整个文件移动到“媒体”目录。过了一会儿,MediaScanner(或其他东西)尝试扫描“挂起”文件夹中的完整文件,并将其插入系统日志。

现在我想知道:为什么MediaScanner试图读取这些文件呢?

根据setDestinationUri的Android API文档:“MediaScanner不会扫描下载的文件。但是它可以通过调用 allowScanningByMediaScanner() 来使其可扫描。我不调用该方法,因此不应扫描下载的文件。

接下来,我试图将一个空的。忽略应用程序的缓存目录,并提醒MediaScanner。通过ACTION_MEDIA_SCANNER_SCAN_FILE忽略文件的存在,但错误消息仍然存在。

为了增加神秘感,这些文件不会出现在系统的图库或视频应用程序中,所以是的,媒体扫描仪会忽略它们。但是,为什么它在不需要的时候试图读取它们呢?到底是MediaScanner还是其他系统服务?

共有2个答案

白才捷
2023-03-14

看起来“.nomedia”甚至不能提供一些人预期的一半效果。在MediaScanner中进一步调查后。java我想说,这个文件根本不会阻止MediaScanner扫描整个树。它仍然为每个文件向MediaStore添加条目,不管是否设置了noMedia。

它只是将MediaStore中的这些条目标记为“不得显示”。在每个文件上,它都会做一个“起始文件”和一个“终结文件”。在endFile中,它总是以这种或那种方式mMediaInserter.insert。

让我如此困扰的是,它扫描了例如挂载的棒中的所有文件,特此冒着陷入病毒(专门为该扫描过程设计)的风险,并且没有.nomedia文件可以阻止它这样做。

阎德宇
2023-03-14

接下来,我试图将一个空的。忽略应用程序的缓存目录,并提醒MediaScanner。通过ACTION_MEDIA_SCANNER_SCAN_FILE忽略文件的存在,但错误消息仍然存在。

停止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代码之间反复往复。这是什么原因呢?

 类似资料:
  • 我在时遇到了奇怪的问题,下载成功了,但文件没有存储。 这是我的代码: 我的清单中也包含了。我尝试将目录更改为,但是文件仍然没有存储到downloads目录。我试图在上找到它,但下载的文件也不在那里。那么我的代码出了什么问题?

  • 我有一个Xcode项目,我的小型mac应用程序在编译后在Xcode测试运行中成功运行,但是通过运行调试或发布版本本身,应用程序在开始运行后变得无响应。在构建过程中没有错误或警告。 我不知道从哪里开始解决这个问题,所以完全卡住了。您如何开始调查此类问题?

  • 下载工具 请从官网下载最新版本。工具分为简体中文和繁体中文版,请根据说明选择合适的分流。 开发环境 请确认自己的电脑基本符合以下条件。如显示器分辨率不足,可使用小分辨率版本Editor_lite.exe,或者使用滚动条/切换到全屏。 显示器分辨率:1400x900以上(推荐) 色彩:65536色 (TrueColor, 16bit)以上 操作系统:Windows 2000/XP/Vista/7 D

  • 我的日志工作正常,而我的下载正在运行,显示“下载正在进行!”当它完成“下载完成!”,但同样的情况并没有发生在我的进程中,为什么?我真的需要一些帮助,其他的逻辑来做到这一点真的很感激

  • 在我的站点上,我有一个链接,还有一个php函数可以很好地下载桌面上的文件- 在移动设备(iphone)上,这在chrome浏览器上是行不通的。(我已经知道safari ios的下载,尽管我看到一些下载会提示用户打开另一个应用程序继续。) 所以我试过使用链接,但当点击它时,它只是在一个新的选项卡中打开视频并播放它。 如果我尝试使用php脚本,它会在一个新的选项卡中打开视频,并显示一个划掉的播放按钮(

  • 01. composer 方式 phpGrace 1.2.0 版本已经支持 composer 安装,安装命令 : 1.1 推荐使用阿里提供的镜像 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 1.2 安装 phpGrace composer create-project shenhai