在 Android 上查找作品文件

Find opus files on Android

最近我在我的音乐库中使用 OPUS 文件格式。 尽管 Android 似乎 support the OPUS file format natively 没有多少音乐播放器列出以这种格式编码的音乐曲目。

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

最好的方法是使用 query/cursor。但是 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());

有没有人知道问题出在哪里,或者知道任何解决方法? 任何帮助将不胜感激。

The best way would be to use a query/cursor. However OPUS files are just ignored

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

Then I tried to access my music files manually but without success:

这里有几个问题:

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

And:

A Uri 不是文件。在方案不是 fileUri 上调用 getPath() 是没有意义的,而 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI 的方案是 content

know any workarounds?

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

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

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

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