首页 > 解决方案 > 在 Android 上查找作品文件

问题描述

从最近开始,我在我的音乐库中使用 OPUS 文件格式。尽管 Android 似乎本身就支持 OPUS 文件格式,但列出以这种格式编码的音乐曲目的音乐播放器并不多。

我想创建自己的简单音乐播放器,列出 OPUS 编码的音轨。但是我不知道如何在系统上找到文件。

最好的方法是使用查询/光标。但是 OPUS 文件被忽略

Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                                           null, null, null, null);

System.out.println(cursor.getCount()); //The size of my music library without .opus files

while (cursor.moveToNext()) {
  //.mp3 and .flac files but no .opus files
  System.out.println(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)));
}

然后我尝试手动访问我的音乐文件但没有成功:

File musicDirectory = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC).toURI());
//This directory seems to be empty, length: 0
System.out.println(musicDirectory.list().length);

和:

File file = new File(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI.getPath());
//Exists: false
System.out.println(file.exists());

有没有人知道问题是什么,或者知道任何解决方法?任何帮助,将不胜感激。

标签: androidaudio-playerandroid-cursoropus

解决方案


最好的方法是使用查询/光标。然而 OPUS 文件只是被忽略了

如果您的 Opus 文件与您的 MP3 和 FLAC 文件具有相似的年份(即,它们已在您的测试设备上放置了很长时间),那么MediaStore可能不知道自动索引它们。

然后我尝试手动访问我的音乐文件但没有成功:

这里有几个问题:

  • 构造File函数和toURI()东西是没有意义的,因为getExternalFilesDir()返回一个File
  • File指向您的应用程序特定的外部存储部分,因此除非您的 Opus 文件在那里,File否则不会列出它们
  • 如果您想切换到设备级音乐目录 ( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)),您在 Android 10 及更高版本上不可用

和:

AUri不是文件。调用getPath()一个Uri方案是file没有意义的,而方案MediaStore.Audio.Media.EXTERNAL_CONTENT_URIcontent

知道任何解决方法吗?

您可以尝试MediaStore查询,但是:

  • 基于 MIME 类型的约束,以及
  • 使用MediaStore.Files代替MediaStore.Audio

这也不适用于 Android 10 及更高版本,但如果它有效,它会比自己扫描音乐目录树更快。

除非MediaStore.Audio开始索引 Opus 文件,否则在 Android 10 及更高版本上没有适合您的解决方案。最好是ACTION_OPEN_DOCUMENT_TREE,因此用户可以将您指向包含 Opus 文件的文档树,然后您将扫描该树以查找具有 Opus MIME 类型的文档。这可能有效,但也可能很慢。


推荐阅读