我正在尝试获取手机中的所有音乐文件:
为此我正在使用:
String[] STAR = {"*"};
Uri allExternalSongUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
Cursor cursor = getContentResolver().query(allExternalSongUri, STAR, selection, null, null);
if(cursor != null){
if(cursor.moveToFirst()){
do {
String songName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
Log.i("name", songName);
} while (cursor.moveToNext());
}
cursor.close();
}
但是上面的代码,除了获取音乐文件之外,还会获取一些额外的不必要的文件,例如* sound_screen_on.mp3 *(由某些其他应用程序安装和使用)。
问题是我原生的Android音乐播放器没有列出&播放这些不必要的文件。
如何过滤这些文件。
答案 0 :(得分:11)
您可以使用MediaStore.Audio.AudioColumns类进行过滤。这将返回大量音频文件的值,您可以使用它。
musiccursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
proj, MediaStore.Audio.Media.DURATION + ">= 60000", null, null);
答案 1 :(得分:2)
除了其他人建议的上述方法之外,在db不可靠的情况下,您可以始终使用MediaMetadataRetriever在从db进行第一次过滤后获取所需的信息。
http://developer.android.com/reference/android/media/MediaMetadataRetriever.html
这当然比从媒体数据库中获取现有信息要慢,但它会为您提供作者/专辑/持续时间等其他信息,您可以使用自己从文件列表中获取的自定义过滤器。内容提供商。
答案 2 :(得分:1)
使用相同的代码,我不会得到任何不需要的文件。
通常会将文件标记为忽略,因此媒体扫描程序可能出错了或系统中的索引未更新。
一个应用程序或系统要使用的声音,图像和其他媒体文件只需在同一目录中添加名为“.nomedia”的文件即可被忽略。正如您可以阅读MediaStore provider
的文档public static final String MEDIA_IGNORE_FILENAME
在API级别9中添加了信号通知媒体扫描程序的文件的名称 忽略包含目录及其子目录中的媒体。 开发人员应该使用它来避免出现应用程序图形 画廊同样可以防止应用声音和音乐 出现在音乐应用程序中。
常数值:“。nomedia”
所以,除了来自chintan khetiya的建议,这很好,可能你可以认为有些文件被标记为被忽略,实际上并没有被忽略,并且自己检查。
简单地说,当您迭代光标时,对于每个文件,只需检查在同一目录中是否存在名为MediaStore.MEDIA_IGNORE_FILENAME
的值或硬编码.nomedia
答案 3 :(得分:0)
仅获取_data超过某个值的音乐,例如300kb。