MediaMetadataRetriever返回null,但可以与MediaStore一起使用

编程入门 行业动态 更新时间:2024-10-22 13:50:46
本文介绍了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"; }

非常感谢!

推荐答案

您知道吗- developer.android/reference/android/media/MediaMetadataRetriever.html

MediaMetadataRetriever metaRetriver; metaRetriver = new MediaMetadataRetriever(); metaRetriver.setDataSource("/sdcard/audio.mp3"); try { byte [] art = metaRetriver.getEmbeddedPicture();      Bitmap songImage = BitmapFactory .decodeByteArray(art, 0, art.length); metaRetriver.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));         String artist = metaRetriver .extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));         String genre = metaRetriver .extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE)); } catch (Exception e) { // TO-DO Exception }

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

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

更多推荐

MediaMetadataRetriever返回null,但可以与MediaStore一起使用

本文发布于:2023-10-26 23:33:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1531664.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:MediaMetadataRetriever   null   MediaStore

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!