You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询MediaStore无法找到MP4文件问题求助

问题出在哪?

本质是Android的媒体扫描器(MediaScanner)认扩展名的逻辑,再加上Android 13的媒体库索引规则搞的:

  1. 扩展名优先判类型:
    Android的媒体扫描器先看扩展名定文件类型:

    • .mp4默认被当成视频文件,哪怕你的文件里只有音频轨道(MIME类型为audio/x-m4a)
    • .m4b/.m4a这类扩展名直接被标成音频文件,扫描器会主动把它们加到MediaStore的索引里
  2. 目录和类型要匹配:
    Android 13的分区存储规则下,扫描器会对公共目录的文件做类型校验:

    • Music/目录下,扫描器默认只主动索引带音频标准扩展名的文件;.mp4是视频关联的扩展名,哪怕内容是音频,也可能被跳过索引——就算勉强识别成视频,视频文件默认该在Movies/目录,最后也不会进到你查询的索引结果里
  3. 改名触发重新扫描:
    你改成.m4b后,系统检测到文件变化,自动触发扫描。这时候扫描器认出是音频扩展名,就把它正确加到了MediaStore的音频表和文件表,所以查询就有结果了。

解决办法

1. 用标准音频扩展名(最省心)

直接把文件扩展名改成.m4a或.m4b,完全符合Android的索引规则,不用额外写代码处理。

2. 手动触发媒体扫描

要是必须保留.mp4扩展名,就在文件放置完成后,主动让系统重新扫描它:

// 构建目标文件路径
File targetFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC), "MP4TestFiles/你的音频文件.mp4");
// 生成MediaStore的Content Uri(Android 10+推荐写法)
Uri fileUri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL)
        .buildUpon()
        .appendPath(getFileIdByPath(targetFile)) // 需自行实现根据文件路径查询MediaStore文件ID的方法
        .build();
// 发送广播触发媒体扫描
Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, fileUri);
sendBroadcast(scanIntent);

如果是Android 10以下设备,也可以用简化写法(注意Android 10+会触发FileUriExposedException):

Uri fileUri = Uri.fromFile(targetFile);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, fileUri));

3. 直接读文件(绕开MediaStore)

要是不需要依赖MediaStore的索引,直接通过文件路径读取内容即可,不用查询媒体库:

File audioFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC), "MP4TestFiles/你的音频文件.mp4");
if (audioFile.exists()) {
    // 此处直接读取文件内容即可
}

注意要确保你的APP已申请READ_EXTERNAL_STORAGE权限。


内容的提问来源于stack exchange,提问作者GGK stands for Ukraine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:30:45