2017-08-10 68 views
0

这个问题有两个部分的Android读取多个MP3文件

首先

,我读了我的手机存储多个MP3文件(几百),并将它们保存在类歌曲的ArrayList至极我做

class Song 
{ 
    String name, path, album, artist, duration; 
    Bitmap cover; 
} 

而且我一直在内存不足,所以我应该如何保存它们?

读取文件的速度很慢,我curently使用

File directory = new File("/storage/3666-6134/Music"); 
File[] files = directory.listFiles(); 
for (File file : files) 
{ 
    Song temp = new Song(file.getAbsolutePath()); 
    songs.add(temp); 
} 

我要去猜测,有一个更快和/或更好的方式来做到这一点

谢谢

编辑: 看起来缓慢也来自MediaMetadataRetriever setDataSource 是重新更快的交替?

回答

0

我为我的音乐应用程序使用了ContentResolver

对于首先你必须得到它通过游标查询之后已经存储的数据MediaStore迭代和光标为每个结果所以在最后你的代码看起来就像这样:

ContentResolver musicResolver = getContentResolver(); 
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null); 

if(musicCursor!=null && musicCursor.moveToFirst()){ 
    //get columns 
    int titleColumn = musicCursor.getColumnIndex 
    (android.provider.MediaStore.Audio.Media.TITLE); 
    int idColumn = musicCursor.getColumnIndex 
    (android.provider.MediaStore.Audio.Media._ID); 
    int artistColumn = musicCursor.getColumnIndex 
    (android.provider.MediaStore.Audio.Media.ARTIST); 
    //add songs to list 
    do { 
    long thisId = musicCursor.getLong(idColumn); 
    String thisTitle = musicCursor.getString(titleColumn); 
    String thisArtist = musicCursor.getString(artistColumn); 
    songList.add(new Song(thisId, thisTitle, thisArtist)); 
    } 
    while (musicCursor.moveToNext()); 
} 

你甚至可以从创建音乐播放器的标准代码here

0

你为什么要在ArrayList中添加它?是为了玩游戏吗?如果是,那么只需将路径保存在ArrayList中,然后在需要播放或显示时执行需要执行的操作。

0

有几个问题你的方法:

  1. 你会得到OOM问题,因为你正在将所有数百个Bitmap加载到内存中,这不是一个好主意。你之所以崩溃的原因。尝试使用WeakReference来代替。

  2. 加载文件列表相当快,慢的部分是你的解码Bitmap部分(I gess)。尝试使用另一个Thread延迟加载您的Bitmap