2017-08-10 106 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