2016-09-13 2 views
1

Я занимаюсь разработкой музыкального плеера в Android, но застрял в чтении файлов MP3. вот мой код, чтобы прочитать все mp3-файлы. но не удаляет файлы с устройства (хотя есть некоторые файлы, которые я копировал с помощью adb). Я также хочу, чтобы он отображал альбом, исполнителя и т. Д., Пожалуйста, помогите в этом.Список всех Mp3-файлов в android

final String MEDIA_PATH = Environment.getExternalStorageDirectory()+""; 

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) { 
    if (home.listFiles(new FileExtensionFilter())!=null) { 

     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

попробуйте http://stackoverflow.com/a/38239152/3946555, по этой ссылке вы найдете, как получить файл с «.mp3» как из памяти телефона, так и из памяти sdCard. надеюсь, это поможет вам – Madhan

+0

Если вы хотите перечислить песни в качестве альбома (или) Artist wise. вы должны использовать MediaStore ContentProvider. вот официальный документ https://developer.android.com/reference/android/provider/MediaStore.html – Madhan

+0

привет @ Мадхан спасибо за mesg, я пробую это, но то же самое .. вы можете мне помочь в этом. –

ответ

6

здесь я модифицированный ваш getPlayList(). загляните в нее.

ArrayList<HashMap<String,String>> getPlayList(String rootPath) { 
      ArrayList<HashMap<String,String>> fileList = new ArrayList<>(); 


      try { 
       File rootFolder = new File(rootPath); 
       File[] files = rootFolder.listFiles(); //here you will get NPE if directory doesn't contains any file,handle it like this. 
       for (File file : files) { 
        if (file.isDirectory()) { 
         if (getPlayList(file.getAbsolutePath()) != null) { 
          fileList.addAll(getPlayList(file.getAbsolutePath())); 
         } else { 
          break; 
         } 
        } else if (file.getName().endsWith(".mp3")) { 
         HashMap<String, String> song = new HashMap<>(); 
         song.put("file_path", file.getAbsolutePath()); 
         song.put("file_name", file.getName()); 
         fileList.add(song); 
        } 
       } 
       return fileList; 
      } catch (Exception e) { 
       return null; 
      } 
     } 

вы можете получить название песни и путь песни, как это:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main_activity); 
ArrayList<HashMap<String,String>> songList=getPlayList("/storage/sdcard1/"); 
     if(songList!=null){ 
     for(int i=0;i<songList.size();i++){ 
     String fileName=songList.get(i).get("file_name"); 
     String filePath=songList.get(i).get("file_path"); 
     //here you will get list of file name and file path that present in your device 
     log.e("file details "," name ="+fileName +" path = "+filePath); 
     } 
     } 
    } 

Примечание: использование "/ хранение/sdcard1 /" для чтения файлов из SDCard и использовать Environment.getExternalStorageDirectory() .getAbsolutePath() для чтения файлов из памяти телефона

Надеюсь, это вам поможет.

+0

большое вам спасибо. его работы для меня. и вы спасли мне столько часов ... спасибо еще раз. –

+0

Привет @ Мадхан Снова я беспокою вас. Можем ли мы ограничить рекурсию до 3 или 5 папок. Его цикл для всех подпапок и его принятие так много времени. я попытался остановиться после того, как 3 файла поиска, но не работает. Спасибо. –

+0

Если для получения всех ваших данных требуется слишком много времени, запустите этот метод в отдельном потоке. не ограничивайте его без уважительной причины. вы можете использовать класс AsyncTask для решения этой проблемы. – Madhan

3

Попробуйте этот метод

String path; 
File sdCardRoot = Environment.getExternalStorageDirectory(); 
File dir = new File(sdCardRoot.getAbsolutePath() + "/yourDirectory/"); 

if (dir.exists()) { 

    if (dir.listFiles() != null) { 
     for (File f : dir.listFiles()) { 
      if (f.isFile()) 
       path = f.getName(); 

      if (path.contains(".mp3")) { 
       yourArrayList.add(path); 

      } 
     } 
    } 
} 
+0

не работает. получение нулевого значения здесь dir. ** if (dir.listFiles()! = null) {** –

+0

это означает, что в этой папке нет mp3-файла ... попробуйте изменить имя папки и проверить, является ли dir нулевым или нет. – AbhayBohra

+0

@kushalPatil хочет отобразить все файлы с телефона, а не в определенную папку. поэтому эта логика не работает. – Madhan

1

Надеется, что вы уже нашли ответ на свой вопрос, но можешь быть это лучше, и если вы хотите попробовать, вот ваше решению использовать следующий код, чтобы прочитать MP3 файл из определенной папки или всех файлов,

Прежде все создайте класс 1 модели, как указано ниже, до GET и SET Файлы в списке.

AudioModel.class

public class AudioModel { 

    String aPath; 
    String aName; 
    String aAlbum; 
    String aArtist; 

    public String getaPath() { 
     return aPath; 
    } 

    public void setaPath(String aPath) { 
     this.aPath = aPath; 
    } 

    public String getaName() { 
     return aName; 
    } 

    public void setaName(String aName) { 
     this.aName = aName; 
    } 

    public String getaAlbum() { 
     return aAlbum; 
    } 

    public void setaAlbum(String aAlbum) { 
     this.aAlbum = aAlbum; 
    } 

    public String getaArtist() { 
     return aArtist; 
    } 

    public void setaArtist(String aArtist) { 
     this.aArtist = aArtist; 
    } 
} 

Теперь у нас есть модель класса, используйте код ниже, чтобы прочитать все файлы MP3 из папки или устройства.

Это будет возвращать список всех файлов MP3 с музыкой NAME, PATH, ARTIST, ALBUM и если вы хотите более подробно смотрите Media.Store.Audio документ .. https://developer.android.com/reference/android/provider/MediaStore.Audio.html

public List<AudioModel> getAllAudioFromDevice(final Context context) { 

     final List<AudioModel> tempAudioList = new ArrayList<>(); 

     Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     String[] projection = {MediaStore.Audio.AudioColumns.DATA, MediaStore.Audio.AudioColumns.ALBUM, MediaStore.Audio.ArtistColumns.ARTIST,}; 
     Cursor c = context.getContentResolver().query(uri, projection, MediaStore.Audio.Media.DATA + " like ? ", new String[]{"%yourFolderName%"}, null); 

     if (c != null) { 
      while (c.moveToNext()) { 

       AudioModel audioModel = new AudioModel(); 
       String path = c.getString(0); 
       String album = c.getString(1); 
       String artist = c.getString(2); 

       String name = path.substring(path.lastIndexOf("/") + 1); 

       audioModel.setaName(name); 
       audioModel.setaAlbum(album); 
       audioModel.setaArtist(artist); 
       audioModel.setaPath(path); 

       Log.e("Name :" + name, " Album :" + album); 
       Log.e("Path :" + path, " Artist :" + artist); 

       tempAudioList.add(audioModel); 
      } 
      c.close(); 
     } 

     return tempAudioList; 
    } 

для чтения файлов в определенной папке, используйте ниже запрос и написать имя папки в Query ..

Cursor c = context.getContentResolver().query(uri, 
              projection, 
              MediaStore.Audio.Media.DATA + " like ? ", 
              new String[]{"%yourFolderName%"}, // yourFolderName 
              null); 

Если вы хотите все файлы использование устройства ниже запроса ..

Cursor c = context.getContentResolver().query(uri, 
              projection, 
              null, 
              null, 
              null); 

Не забудьте добавить разрешение хранения .. наслаждаться.

+0

Wow спасибо, это очень быстро, будет ли последний запрос давать файлы в sdcard? – Redman

+0

Измените эту строку, чтобы получить данные от директора дифф: ** Uri Uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; ** ** Uri Uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI; ** –

+0

'MediaStore.Audio .Media.EXTERNAL_CONTENT_URI' достаточно, я думаю, его листинг из внутренних и sdcard – Redman

Смежные вопросы