如何使用MediametadataRetriever从android / album / Artist中获取歌曲?

首先,我是一个新手,其次我知道有一个解决scheme“如何从Android专辑中获取歌曲?” 但是这是通过使用光标和MediaStore和我已经使用MediametadataRetriever和它完全不同我没有使用hashmaps和所有…..所以它变得有点困难….请为此任何解决scheme???不使用hashmaps和mediastore?

这里是我用来显示所有歌曲和它的艺术家的代码……….

import java.io.File; import java.io.FileFilter; import java.io.FilenameFilter; import java.io.Serializable; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.ListFragment; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; public class FragmentSongs extends Fragment implements Serializable { AdapterView.AdapterContextMenuInfo info; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_song, container, false); ListView SngList = (ListView) view.findViewById(R.id.SongList); registerForContextMenu(SngList); File f=new File("/sdcard/Music"); int j=0;int i=0; final ArrayList<SongDetails> Songinfo = getSongsFromDirectory(f); if (Songinfo.size()>0) { for( j=0; j<Songinfo.size();j++) { for ( i=j+1 ; i<Songinfo.size(); i++) { SongDetails a=Songinfo.get(i); SongDetails b=Songinfo.get(j); if (a.getSong().toLowerCase().compareTo(b.getSong().toLowerCase()) < 0) { Songinfo.set(i,b ); Songinfo.set(j,a); } } } SngList.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView a, View v, int position, long id) { Intent intent = new Intent(getActivity(), NowPlaying.class); intent.putParcelableArrayListExtra("Data1",Songinfo); intent.putExtra("Data2",position); startActivity(intent); } }); SngList.setAdapter(new CustomAdapter(Songinfo)); return view; } else { return null; } } public ArrayList<SongDetails> getSongsFromDirectory(File f) { MediaMetadataRetriever mmr = new MediaMetadataRetriever(); ArrayList<SongDetails> songs = new ArrayList<SongDetails>(); Bitmap bitmap2; Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ab); float ht_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics()); float wt_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics()); Bitmap bitmap3 = Bitmap.createScaledBitmap(bmp, (int) ht_px, (int) wt_px, true); byte[] rawArt = null; Bitmap art; BitmapFactory.Options bfo=new BitmapFactory.Options(); if (!f.exists() || !f.isDirectory()) { return songs; } File[] files = f.listFiles(new Mp3Filter()); for(int i=0; i<files.length; i++) { if (files[i].isFile()) { mmr.setDataSource(files[i].getPath()); rawArt = mmr.getEmbeddedPicture(); SongDetails detail=new SongDetails(); if ( rawArt != null) { bitmap2=BitmapFactory.decodeByteArray(rawArt, 0, rawArt.length, bfo); bitmap2 = Bitmap.createScaledBitmap(bitmap2, (int) ht_px, (int) wt_px, true); detail.setIcon(bitmap2); } else { detail.setIcon(bitmap3); } detail.setSong(files[i].getName()); detail.setArtist(files[i].getName()); detail.setArtist( mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST)); detail.setAlbum( mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM)); detail.setPath2( files[i].getPath()) ; songs.add(detail); } else if (files[i].isDirectory()) { songs.addAll(getSongsFromDirectory(files[i])); } } return songs; } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); info = (AdapterContextMenuInfo) menuInfo; menu.add(Menu.NONE, v.getId(), 0, "Play"); menu.add(Menu.NONE, v.getId(), 0, "Delete"); menu.add(Menu.NONE, v.getId(), 0, "Queue Item"); } @Override public boolean onContextItemSelected(MenuItem item) { if (item.getTitle() == "Play") { } else if (item.getTitle() == "Delete") { } else if (item.getTitle() == "Queue Item") { } else { return false; } return true; } } class Mp3Filter implements FileFilter { public boolean accept(File file) { return (file.isDirectory()||file.getName().endsWith(".mp3")|| file.getName().endsWith(".Mp3")); } } 

Solutions Collecting From Web of "如何使用MediametadataRetriever从android / album / Artist中获取歌曲?"

看看这个教程:

http://www.srikanthtechnologies.com/blog/android/audioplayer.aspx

您可以稍微修改它以适应您的需求:

 private ArrayList<SongDeatils> getSongList(File musicFolder) { ArrayList<SongDeatils> songs = new ArrayList<SongDeatils>(); for (File f : musicFolder.listFiles()) { MediaMetadataRetriever md = new MediaMetadataRetriever(); md.setDataSource(musicFolder + "/" + f.getName()); // Assign variables like title, artist, etc SongDeatils s = new SongDeatils(); s.setTitle(title); s.setArtist(artist); s.setSong(f.getPath()); // ... songs.add(s); } return songs; } 

对于图像(封面艺术)处理,它应该在适配器中asynchronous完成。 我build议使用通用图像加载器 。

更新:

刚刚看到您的意见。 您真正想要的是一种有效的方式来列出来自特定专辑或艺术家的歌曲,而不使用文件filter和sorting。 唯一的其他select就是使用MediaStore / Cursor 。 您可以构build不同types的查询,具体取决于您如何查看数据。

因此,要查询艺术家列表,您可以使用MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI并使用艺术家姓名作为select参数。

对于相册列表,您现在可以使用ARTIST_KEY查询MediaStore.Audio.Artists.Albums.EXTERNAL_CONTENT_URI ,以获取给定艺术家的相册列表。

有关如何列出给定艺术家的所有专辑的示例,请参阅此处 。

@Anknit Mediastore不检测您设备上的所有目录。 不,它比我们试图构build自己的代码的速度快得多。 但它没有检测到一些文件夹。 今天我在我的手机中创build我的项目我有目录即.trash-100&.trash它包含几乎.mp3文件。 除了Poweramp之外,甚至没有被VLC和音乐播放器检测到。 请参考以下链接http://mrbool.com/how-to-extract-meta-data-from-media-file-in-android/28130我只是使用recursion为它,它工作正&#x5E38;