查询MediaStore无法找到MP4文件问题求助
问题出在哪?
本质是Android的媒体扫描器(MediaScanner)认扩展名的逻辑,再加上Android 13的媒体库索引规则搞的:
扩展名优先判类型:
Android的媒体扫描器先看扩展名定文件类型:.mp4默认被当成视频文件,哪怕你的文件里只有音频轨道(MIME类型为audio/x-m4a).m4b/.m4a这类扩展名直接被标成音频文件,扫描器会主动把它们加到MediaStore的索引里
目录和类型要匹配:
Android 13的分区存储规则下,扫描器会对公共目录的文件做类型校验:Music/目录下,扫描器默认只主动索引带音频标准扩展名的文件;.mp4是视频关联的扩展名,哪怕内容是音频,也可能被跳过索引——就算勉强识别成视频,视频文件默认该在Movies/目录,最后也不会进到你查询的索引结果里
改名触发重新扫描:
你改成.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
相关产品推荐
相关产品推荐

