【发布时间】:2014-06-22 18:25:26
【问题描述】:
我正在尝试在我的原始文件夹中检索有关音乐文件的信息。我需要检索持续时间、标题、艺术家等。我了解如何检索存储在外部存储中的音乐文件的此信息,但我不知道如何检索原始文件夹中的音乐文件。帮助和链接将不胜感激!
【问题讨论】:
标签: android cursor uri android-mediaplayer android-contentresolver
我正在尝试在我的原始文件夹中检索有关音乐文件的信息。我需要检索持续时间、标题、艺术家等。我了解如何检索存储在外部存储中的音乐文件的此信息,但我不知道如何检索原始文件夹中的音乐文件。帮助和链接将不胜感激!
【问题讨论】:
标签: android cursor uri android-mediaplayer android-contentresolver
搜索并尝试以下示例后,我没有成功。当我设置 MediaMetadataRetriever 的源时,@Jignesh Shaw 的解决方案给了我一个 IllegalArgumentException,而@Hanz Kratz 的解决方案只能提取歌曲的持续时间(如他所述)
然而,在这两者之间,我受到了启发,想出了一个可行的解决方案。
Uri mediaPath = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.song_name);
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(this, mediaPath);
然后可以像两个用户所说的那样提取信息
String sponsorTitle = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
String sponsorArtist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
//and so on...
我不知道为什么这可以完美运行,但@Hanz Kratz 的解决方案却不行。如果其他人偶然发现了这个线程,那么如果你发布你的发现会很好。谢谢大家!
【讨论】:
只需获取原始资产的FileDescriptor,然后使用MediaMetadataRetriever 提取持续时间等元数据。
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
FileDescriptor fd = getResources().openRawResourceFd(R.raw.rocknroll).getFileDescriptor();
mmr.setDataSource(fd);
String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
这在持续时间内可以正常工作,但不幸的是MediaMetadataRetriever 在艺术家、标题等方面存在问题...与一些 MP3 文件:Android MediaMetadataRetriever returns null values from most keys
【讨论】:
这可能会有所帮助:-
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
String[] projection = { MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.DURATION};
cursor = this.managedQuery(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection,null, null);
private List<String> songs = new ArrayList<String>();
while(cursor.moveToNext()){
songs.add(cursor.getString(0) + "||" + cursor.getString(1) + "||" +
cursor.getString(2) + "||" + cursor.getString(3) + "||" +
cursor.getString(4) + "||" + cursor.getString(5));
}
【讨论】:
像这样加载资源的路径:
String mediaPath = Uri.parse("android.resource://<your-package-name>/raw/filename").getPath();
确保不附加文件扩展名。例如使用“文件名”而不是“文件名.mp3”
然后您可以像这样访问 ID3 标签(假设您使用的是 mp3 文件):
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(mediaPath);
String albumName = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
等等..
希望这会有所帮助!
【讨论】: