2013-04-24 20 views
0

我剛學了幾個月的Android編程。我試圖創建簡單的音樂播放器,但當我想打開所有mp3文件時遇到問題,因爲我只能打開1個特定文件夾,例如「sdcard」。Android從所有文件夾加載媒體

我發現這個示例代碼AndroidHive只能播放來自「sdcard」的mp3文件。

public class SongsManager { 
// SDCard Path 
final String MEDIA_PATH = new String("/sdcard/"); 
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")); 
    } 
} 

雖然我發現了另一個代碼,可以用遞歸讀取整個SD卡的所有MP3文件,但我糊塗了,因爲我不明白如何調用功能分成上面的代碼。

這是代碼:

// this method creates a list of file extensions that will be searched 
// 
public static ArrayList<String> createAudioExtensionsList() 
{ 
    ArrayList<String> extensions = new ArrayList<String>(); 

    extensions.add(".mp3"); 
    extensions.add(".ogg"); 
    extensions.add(".flac"); 
    extensions.add(".wav"); 
    extensions.add(".3gp"); 

    return extensions; 
} 

// simple method to get a file extension (does not work with complex extensions like .tar.gz) 
// 
public static String getFileExtension(String fileName) 
{ 
    String result = fileName.substring(fileName.lastIndexOf(".")); 
    return result; 
} 

// recursively scans a folder for all files containing one of the file extensions 
// 
public static LinkedList<File> getFilesInFolder(File rootDir, ArrayList<String> extensions) 
{ 
    LinkedList<File> results = new LinkedList<File>(); 
    File[] files = rootDir.listFiles(); 

    for(File file : files) 
    { 
     if(file.isDirectory()) 
      results.addAll(getFilesInFolder(file, extensions)); 
     else 
     { 
      for(String s : extensions) 
      { 
       String ext = getFileExtension(file.getName()); 
       if(s.equalsIgnoreCase(ext)) 
        results.add(file); 
      } 
     } 
    } 
    return results; 
} 

我相信getFileExtension將返回的MP3歌曲的所有數據,但我不知道如何將其調入主要功能(文件首頁=新文件(MEDIA_PATH);)。我希望你能幫助或告訴我,我們可以稱呼這些功能。非常感謝你。

回答

1

我很抱歉令人失望,但所有手動搜索文件的代碼已由Content provider自動完成,您只需向內容提供商查詢音樂即可。

Media Store保存對您要查詢的字段的引用。

大概是這樣的:

Cursor c = getContentResolver().query(
      MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
      new String[] { MediaStore.Audio.Media._ID, 
          MediaStore.Audio.Media.DATA, 
          MediaStore.Audio.Media.ARTIST, 
          MediaStore.Audio.Media.ALBUM, 
          MediaStore.Audio.Media.DISPLAY_NAME }, "1=1", null, null); 

,然後你與音樂的ID,流實際的音樂,藝術家名稱,專輯名稱和顯示名稱光標,

+0

是否有可能只趕上mp3文件的唯一路徑玩什麼呢? – Irwan 2013-04-25 16:57:32

+0

我知道你可以拍照,所以很可能。但是,您必須向Google瞭解一下MediaStore和內容提供商,才能找到原因我不知道的原因! – Budius 2013-04-25 17:04:23

1

要獲得所有歌曲

cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null); 
    musicPath = new String[cursor.getCount()]; 
    musicTitle= new String[cursor.getCount()]; 
    count=cursor.getCount(); 
    cursor.moveToFirst(); 
    do{ 
     musicPath[cursor.getPosition()]=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); 
     musicTitle[cursor.getPosition()]=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)); 

    }while(cursor.moveToNext()); 

    arrayAdapter= new ArrayAdapter(this,R.layout.simple_list_item_1,musicTitle); 
    MusicList.setAdapter(arrayAdapter); 
    cursor.close(); 

實施musiclist的onclick聽者。在該聽衆中,您將獲得點擊歌曲的位置,因此將該歌曲的路徑通過意向傳遞給下一個活動。並按照以下方式播放。

播放的歌曲,從列表中選擇它,並開始新的aactivity和如下

Mediaplayer mp =new MediaPlayer(); 
mp.setDataSoruce(getIntent().getStringExtra("Path","NULL")); 
mp.prepare(); 
mp.start(); 
相關問題