2012-11-26 63 views
23

好的,我已經在這個項目上工作了幾天,大部分時間一直在研究如何在列表視圖中列出設備上的所有音樂否則,我已經搜索了幾天,現在正在殺死我。我確實在一個文件夾中顯示所有音樂的時候都非常接近,不過由於大多數人都會有最喜歡的和專輯的子文件夾,所以我需要一種方法來搜索子文件夾中的MP3或音樂文件。使用PATH列出MediaStore中的所有音樂

這裏是我迄今爲止的音樂收藏:

package com.androidhive.musicplayer; 

import java.io.File; 
import java.io.FilenameFilter; 
import java.util.ArrayList; 
import java.util.HashMap; 

import android.provider.MediaStore; 

public class SongsManager { 
// SDCard Path 
final String MEDIA_PATH = new String(MediaStore.Audio.Media.getContentUri("external").toString()); 
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 

// Constructor 
public SongsManager(){ 

} 

/** 
* Function to read all mp3 files from sdcard 
* and store the details in ArrayList 
* */ 
public ArrayList<HashMap<String, String>> getPlayList(){ 
    File home = new File(MEDIA_PATH); 

    if (home.listFiles(new FileExtensionFilter()).length > 0) { 
     for (File file : home.listFiles(new FileExtensionFilter())) { 
      HashMap<String, String> song = new HashMap<String, String>(); 
      song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4))); 
      song.put("songPath", file.getPath()); 

      // Adding each song to SongList 
      songsList.add(song); 
     } 
    } 
    // return songs list array 
    return songsList; 
} 

/** 
* Class to filter files which are having .mp3 extension 
* */ 
class FileExtensionFilter implements FilenameFilter { 
    public boolean accept(File dir, String name) { 
     return (name.endsWith(".mp3") || name.endsWith(".MP3")); 
    } 
} 

} 

由於任何人誰可以提供幫助。 :)

+0

爲什麼不從MediaStore獲取該列表? –

+0

我怎麼會這樣做,雖然我試過媒體商店.. – user1853951

回答

17

可以使用this code

//Some audio may be explicitly marked as not being music 
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)); 
} 

我還沒有試過這個代碼列出所有的音樂文件,但它似乎是正確的。那你就會走在正確的軌道上。

+0

嗯,我試過你的代碼,雖然我似乎無法得到它的工作,你可以修改我的代碼,並告訴我它是如何完成的:)我會做我自我我只是想讓我的頭靠近它。 – user1853951

+0

@MarvinLabs你知道一種從mediastore獲取文件路徑的可能方法嗎? –

+0

輝煌的代碼。我一直在尋找近8小時的解決方案。謝謝。 –

26

雖然這篇文章比較老,但對於像我這樣的其他人來說,我的想法是用他們的文件路徑創建音樂列表,我在這裏添加了解決方案。 MediaStore.Audio.Media.DATA列實際上包含媒體文件路徑。您可以通過使用以下代碼片段獲取必要的信息:

ContentResolver cr = getActivity().getContentResolver(); 

Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0"; 
String sortOrder = MediaStore.Audio.Media.TITLE + " ASC"; 
Cursor cur = cr.query(uri, null, selection, null, sortOrder); 
int count = 0; 

if(cur != null) 
{ 
    count = cur.getCount(); 

    if(count > 0) 
    { 
     while(cur.moveToNext()) 
     { 
      String data = cur.getString(cur.getColumnIndex(MediaStore.Audio.Media.DATA)); 
      // Add code to get more column here 

      // Save to your list here 
     } 

    } 
} 

cur.close(); 
+0

@AshishSahu你能解釋一下你的評論嗎?我已經讀了好幾遍,並沒有得到你想說的話:) –

+0

@ amos-bordowitz可能代碼在Ashish的評論和評論似乎不合適之後現在被修正:) – Sara

2

我正在處理同一個項目,並且已經解決了問題。

您將需要一個自定義的類來存儲歌曲數據:

package YOUR_PACKAGE; 

public class Songs 
{ 
    private long mSongID; 
    private String mSongTitle; 

    public Songs(long id, String title){ 
     mSongID = id; 
     mSongTitle = title; 
    } 

    public long getSongID(){ 
     return mSongID; 
    } 

    public String getSongTitle(){ 
     return mSongTitle; 
    } 
} 

然後,你必須定義在列表視圖活動ArrayList中,你將有數據填充:

private ArrayList<Songs> arrayList; 

,並在onCreate:

arrayList = new ArrayList<Songs>(); 

然後你必須從你的設備檢索數據:

public void YOUR_METHOD_NAME(){ 
    ContentResolver contentResolver = getContentResolver(); 
    Uri songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    Cursor songCursor = contentResolver.query(songUri, null, null, null, null); 

    if(songCursor != null && songCursor.moveToFirst()) 
    { 
     int songId = songCursor.getColumnIndex(MediaStore.Audio.Media._ID); 
     int songTitle = songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE); 

     do { 
      long currentId = songCursor.getLong(songId); 
      String currentTitle = songCursor.getString(songTitle); 
      arrayList.add(new Songs(currentId, currentTitle, currentArtist)); 
     } while(songCursor.moveToNext()); 
    } 
} 

然後從的onCreate調用這個方法:

YOUR_METHOD_NAME(); 

最後,你必須創建自定義的適配器類,在的onCreate定義這個適配器(與ListView的活動),並設置該適配器您的ListView對象。

我看到它在3年前被問及我認爲已經解決的問題,但它可能對某人有用。謝謝。

相關問題