获得歌曲类型的最有效方式android

时间:2017-06-06 01:02:17

标签: android mediastore

我正在尝试在我加载歌曲时抓住每首歌曲的类型。目前我正在使用这个解决方案:

MediaMetadataRetriever mr = new MediaMetadataRetriever();
Uri trackUri = ContentUris.withAppendedId(
                  android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                  cursor.getLong(id));
mr.setDataSource(c, trackUri);
String genre = mr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE);

它确实有效,但需要花费很长时间。在我的测试手机上只有大约20首歌曲它可以很快地工作,但在我的主手机上有1700多首歌曲需要很长时间。如果我删除该代码并加载它几乎是即时的歌曲,所以我知道它必须是这样。是否有更好/更有效的方式来获得歌曲ID的歌曲类型?

提前感谢您的帮助!

完整的代码段

    try {
        if (cursor.moveToFirst()) {
            int id = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
            int title = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
            int album = cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
            int artist = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
            int duration = cursor.getColumnIndex(MediaStore.Audio.Media.DURATION);
            int albumId = cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID);
            int data = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);



            do {

                MediaMetadataRetriever mr = new MediaMetadataRetriever();
                Uri trackUri = ContentUris.withAppendedId(
                        android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                        cursor.getLong(id));
                mr.setDataSource(c, trackUri);
                String genre = mr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE);

                if (genre == null){
                    genre = "Not Specified";
                }


                 genres.add(genre);

                Song item = new Song(cursor.getLong(id), cursor.getString(title),
                        cursor.getString(artist), cursor.getString(album),
                        cursor.getLong(duration),
                        ContentUris.withAppendedId(albumArtUri, cursor.getLong(albumId)),
                        Uri.parse(cursor.getString(data)), "");

                items.add(item);
            } while (cursor.moveToNext());
        }
    } finally {
        cursor.close();
    }

1 个答案:

答案 0 :(得分:1)

你的do-while循环可能是造成瓶颈的原因。您可以尝试实现代码以并行执行循环的迭代,而不是像您一样按顺序迭代。

我不确定游标正在迭代什么类型的数据结构,但假设它是一个名为allCursors的数据结构,代码看起来像这样:

allCursors.parallelStream().forEach(cursor -> {
    // inside of loop
});