Patrick L
Patrick L

Reputation: 155

get mp3 files from path

I'm trying to get mp3 files from a folder path of my system to list it in my listView, but unfortunately there's always the same error. (java.lang.NullPointerException: Attempt to get length of null array)

class Mp3Filter implements FilenameFilter{
public boolean accept(File dir, String name){
    return (name.endsWith(".mp3"));
}
}

private static final String SD_PATH = new String(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).toString());

public void searchForSongs() {

    ListView listView;
    listView = (ListView) findViewById(R.id.listView);

    File f = new File(SD_PATH);

   try {

          if (f.listFiles(new Mp3Filter()).length > 0){
           for (File file : f.listFiles(new Mp3Filter())){
                  list.add(file.getName());
              }
       }

    }

    catch(Exception e) {
        textView2.setText(""+e);
        return;
    }

    final ArrayAdapter songList = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list);
    listView.setAdapter(songList);
}

Upvotes: 2

Views: 1704

Answers (1)

Uttam Panchasara
Uttam Panchasara

Reputation: 5865

Here is your solution use the following code to Read the MP3 file from the Specific Folder..

First of all Create 1 Model class as Given Below, to GET and SET Files in list.

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;
    }
}

Now We have our Model Class Now use the below code to Read the all MP3 files from your Folder.

This will return list of all MP3 Files with Music NAME, PATH, ARTIST, ALBUM and if you wants more detail please refer Media.Store.Audio doc.. 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;
    }

To Read Files of Specific Folder, use below Query and write your folder name in Query..

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

If you wants All Files of device use below Query..

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

Don't forget to add Storage Permission .. enjoy.

Upvotes: 2

Related Questions