2013-04-18 91 views
1

我試圖掃描我SD卡中的所有.mp3文件並保存其名稱。 這是一個代碼片段,負責這個。 1.我做錯了什麼? 1. SD卡/ mnt/sdcard或/ sdcard的正確路徑是什麼?android掃描SD卡中的所有.mp3文件

public class PlayerActivity extends Activity 
{ 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.player_activity); 
    } 
    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>>(); 

     public SongsManager() 
     { 

     } 

     public ArrayList<HashMap<String, String>> getPlayList() 
     { 
     // File home = new File(MEDIA_PATH); 
      File home = Environment.getExternalStorageDirectory(); 

      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 FileExtensionFilter implements FilenameFilter 
     { 
      public boolean accept(File dir, String name) 
      { 
       return (name.endsWith(".mp3") || name.endsWith(".MP3")); 
      } 
     } 

    } 
} 

在此先感謝。

+0

我似乎記得Nexus 7中存在一個錯誤,在通過adb連接時會破壞'Environment.getExternalStorageDirectory();'的其他設備。你使用什麼設備?當你運行上面的代碼時會發生什麼?什麼不行? – soulseekah

+0

我正在使用galaxy Ace。 當我運行代碼時,問題不會發生。 我也嘗試設置主路徑\ mnt \ sdcard,但它不起作用。 – user2249145

+0

我在Nexus 7上開發,我沒有看到使用Environment.getExternalStorageDirectory()的任何問題; –

回答

0

我不確定你的代碼有什麼問題。但是,你可以給這個方法一試:

public HashMap<String, String> scanDirectory(File dir) { 

HashMap<String, String> song; 
String mp3Pattern = ".mp3"; 
File listFile[] = dir.listFiles(); 

if (listFile != null) { 
    for (int i = 0; i < listFile.length; i++) { 

     if (listFile[i].isDirectory()) { 
      walkdir(listFile[i]); 
     } else { 
      if (listFile[i].getName().endsWith(mp3Pattern)){ 
       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 song; 
    } 

要掃描整個產品SD卡的MP3呼叫scanDirectory(Environment.getExternalStorageDirectory());

+0

問題是這個代碼是不掃描整個SD卡。 – user2249145

+0

你使用過:'scanDirectory(Environment.getExternalStorageDirectory())'? – gauravsapiens

+0

是的,我試過了,但結果是一樣的。 – user2249145

5

試試這個代碼片段

final String MEDIA_PATH = Environment.getExternalStorageDirectory() 
     .getPath() + "/"; 
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 
private String mp3Pattern = ".mp3"; 

// Constructor 
public SongsManager() { 

} 

/** 
* Function to read all mp3 files and store the details in 
* ArrayList 
* */ 
public ArrayList<HashMap<String, String>> getPlayList() { 
    System.out.println(MEDIA_PATH); 
    if (MEDIA_PATH != null) { 
     File home = new File(MEDIA_PATH); 
     File[] listFiles = home.listFiles(); 
     if (listFiles != null && listFiles.length > 0) { 
      for (File file : listFiles) { 
       System.out.println(file.getAbsolutePath()); 
       if (file.isDirectory()) { 
        scanDirectory(file); 
       } else { 
        addSongToList(file); 
       } 
      } 
     } 
    } 
    // return songs list array 
    return songsList; 
} 

private void scanDirectory(File directory) { 
    if (directory != null) { 
     File[] listFiles = directory.listFiles(); 
     if (listFiles != null && listFiles.length > 0) { 
      for (File file : listFiles) { 
       if (file.isDirectory()) { 
        scanDirectory(file); 
       } else { 
        addSongToList(file); 
       } 

      } 
     } 
    } 
} 

private void addSongToList(File song) { 
    if (song.getName().endsWith(mp3Pattern)) { 
     HashMap<String, String> songMap = new HashMap<String, String>(); 
     songMap.put("songTitle", 
       song.getName().substring(0, (song.getName().length() - 4))); 
     songMap.put("songPath", song.getPath()); 

     // Adding each song to SongList 
     songsList.add(songMap); 
    } 
} 
+0

代碼是好的,但它的外部SD卡加載文件,它只是獲取內部手機內存文件,反正謝謝 – sijeesh

+0

感謝+1節省我的一天!並愛你的網站!和想法也。 – 2016-10-06 16:02:26

-2

試試這個: 最後絃樂MEDIA_PATH =「/存儲/」;

+0

你不應該使用任何硬編碼路徑,因爲它們只能在某些設備上工作。 – Chaoz

-1

問題是什麼android認爲是外部存儲。它並不總是您添加到設備的SD卡。內部存儲器也可以是外部存儲器。/sdcard或/ mnt/sdcard是相同的位置,它可能指向您的內部存儲。所以你必須完全掃描/ mnt文件夾。像某些設備/ mnt/sdcard將會是內部存儲器,並且 /mnt/extSdCard將成爲您添加的內存。 File home = Environment.getExternalStorageDirectory(); 此方法將返回第一個外部存儲,而不是全部。

0

Environment.getExternalStorageDirectory().getPath()通常爲 「/ storage/emulated/0 /」左右。

您拆分此獲取根 -

String media_path = Environment.getExternalStorageDirectory().getPath(); 
String[] splitPath= media_path .split("/"); 
final String MEDIA_PATH = "/" + splitPath[1] + "/"; 

這工作!

相關問題