MediaMetadataRetriever返回null,但可以与MediaStore一起使用 [英] MediaMetadataRetriever returns null but fine with MediaStore

查看:88
本文介绍了MediaMetadataRetriever返回null,但可以与MediaStore一起使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是开发android应用程序的新手.
我正在开发音乐播放器,想从音频文件的元数据中获取歌曲名称,艺术家,专辑名称和专辑封面.
我使用了 MediaMetadataRetriever ,但是当有800余首歌曲时,它运行缓慢,某些文件返回null,而其他音乐播放器可以检索到这些信息.

I am a newbie in developing android apps.
I'm developing a music player and would like to get song name, artist, album name, album art from the metadata of audio files.
I have used MediaMetadataRetriever but it is slow when there are 800+ songs and returns null for some files while other music players can retrieve those information.

然后,我使用 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI 来获取歌曲名称,艺术家,专辑名称,并使用 MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI 来获得专辑封面.

Then I use MediaStore.Audio.Media.EXTERNAL_CONTENT_URI to get song name, artist, album name and MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI to get the album art.

是否可以同时获取uri(歌曲名称,艺术家,专辑名称,专辑封面)?
因为我需要在程序中创建一个歌曲对象.

Is there any uri to get (song name, artist, album name, album art) at the same time?
As I need to create a song object in my program.

下面是我的代码,但是它很慢,因为它要求每首歌曲都带有专辑封面.

Below is my code, but it is very slow as it asks for album art for each song.

    public ArrayList<Songs> getPlayList(Context c) {

    String[] TRACK_PROJ = {
            MediaStore.Audio.AudioColumns.ARTIST,
            MediaStore.MediaColumns.TITLE,
            MediaStore.Audio.AudioColumns.ALBUM,
            MediaStore.Audio.AudioColumns.YEAR,
            MediaStore.MediaColumns.DATA
    };
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Cursor cursor = c.getContentResolver().query(uri, TRACK_PROJ, null, null, null);

    int count;

    if (cursor != null) {
        count = cursor.getCount();
        if (count > 0) {
            cursor.moveToFirst();
            do {
                Songs song;
                String artist = cursor.getString(cursor.getColumnIndex(TRACK_PROJ[0]));
                String title = cursor.getString(cursor.getColumnIndex(TRACK_PROJ[1]));
                String album = cursor.getString(cursor.getColumnIndex(TRACK_PROJ[2]));
                String year = cursor.getString(cursor.getColumnIndex(TRACK_PROJ[3]));
                String path = cursor.getString(cursor.getColumnIndex(TRACK_PROJ[4]));
                if (path.toLowerCase().contains(MEDIA_PATH.toLowerCase())) {
                    song = new Songs(artist, title, album, year, path);
                    songsList.add(song);
                }
            } while (cursor.moveToNext());
        }
        cursor.close();
    }

    for (Songs aSongsList : songsList) {

        String[] ALBUM_PROJ = {MediaStore.Audio.Albums.ALBUM_ART};
        String selection = MediaStore.Audio.Albums.ALBUM + "=?";
        String[] values = new String[]{aSongsList.getAlbum()};
        Cursor cur = c.getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, ALBUM_PROJ, selection, values, null);
        int cnt;
        if (cur != null) {
            cnt = cur.getCount();
            if (cnt > 0) {
                cur.moveToFirst();
                do {
                    String art = cur.getString(cur.getColumnIndex(ALBUM_PROJ[0]));
                    if (art != null)
                        aSongsList.setAlbumArt(art);
                } while (cur.moveToNext());
                cur.close();
            }
        }
    }

    return songsList;
}

(使用 MediaMetadataRetriever 的代码)

    private Songs getMetadata (File file){
    String artist, title, album, path;
    MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
    metaRetriever.setDataSource(file.getPath());

    try {

        artist = metaRetriever
                .extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);

        album = metaRetriever
                .extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);

        path = file.getPath();

        title = metaRetriever
                .extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);

    } catch (Exception e) {
        artist = "Unknown";
        title = "Unknown";
        album = "Unknown";
        path = "Unknown";
    }

非常感谢!

推荐答案

您知道吗-

您可能会对上述API中的其他可用选项感兴趣.

You would be interested for other available options in above API.

这篇关于MediaMetadataRetriever返回null,但可以与MediaStore一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆