android - 在 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());
有没有人知道问题是什么,或者知道任何解决方法?任何帮助,将不胜感激。
解决方案
最好的方法是使用查询/光标。然而 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_URI
是content
知道任何解决方法吗?
您可以尝试MediaStore
查询,但是:
- 基于 MIME 类型的约束,以及
- 使用
MediaStore.Files
代替MediaStore.Audio
这也不适用于 Android 10 及更高版本,但如果它有效,它会比自己扫描音乐目录树更快。
除非MediaStore.Audio
开始索引 Opus 文件,否则在 Android 10 及更高版本上没有适合您的解决方案。最好是ACTION_OPEN_DOCUMENT_TREE
,因此用户可以将您指向包含 Opus 文件的文档树,然后您将扫描该树以查找具有 Opus MIME 类型的文档。这可能有效,但也可能很慢。
推荐阅读
- python - 如何从客户端接收整数和字符串的缓冲区,并正确存储它们?(cpp 服务器,python 客户端)
- python - 方法定义中的星号
- php - 如果其他代码相同,但条件不同
- c# - 如何格式化单行 JSON 字符串
- codeigniter - 使用模板页面从仪表板调用另一个控制器
- angular - Angular RxJS:两个嵌套的 https 并在第一个到达时更新组件
- .net - MSB3073:命令 dotnet bundle clean 在 Visual Studio 2019 Asp.NetCore 项目中以代码 1 退出
- javascript - Google ReCaptcha V3 - 缺少必需参数:sitekey
- python-3.x - pytables 的 DLL 加载失败
- machine-learning - 验证集上的验证过程 - 不是 k 折交叉验证