如何过滤掉Android中相关的媒体文件?

时间:2014-02-11 16:50:33

标签: android android-mediaplayer

我正在尝试获取手机中的所有音乐文件:

为此我正在使用:

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音乐播放器没有列出&播放这些不必要的文件。

如何过滤这些文件。

4 个答案:

答案 0 :(得分:11)

您可以使用MediaStore.Audio.AudioColumns类进行过滤。这将返回大量音频文件的值,您可以使用它。

musiccursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            proj, MediaStore.Audio.Media.DURATION + ">= 60000", null, null);
  • Duration过滤 - 音频文件的持续时间,以毫秒为单位
  • Type-Music过滤 - 如果音频文件是音乐
  • 则不为零
  • Type-RingTone过滤 - 如果音频文件可能是铃声,则非零
  • Type-Alarm过滤 - 如果音频文件可能是闹钟,则非零

Check for more reference

答案 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。