在 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
不是文件。在方案不是 file
的 Uri
上调用 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 类型的文档。这可能有效,但也可能很慢。
最近我在我的音乐库中使用 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 aFile
File
指向 external storage 中您的应用程序特定部分,因此除非您的 Opus 文件在那里,否则此File
不会列出它们- 如果您想切换到设备级音乐目录 (
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
),那在 Android 10 及更高版本 上不可用
And:
A Uri
不是文件。在方案不是 file
的 Uri
上调用 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 类型的文档。这可能有效,但也可能很慢。