2015-01-15 55 views
2

我試圖從我的系統的文件夾路徑中獲取mp3文件,以將其列在我的listView中,但不幸的是,總是有相同的錯誤。 (顯示java.lang.NullPointerException:嘗試獲取空數組的長度)從路徑獲取mp3文件

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); 
} 
+0

你應該至少發佈完整的堆棧跟蹤 - 這將有助於知道NPE來自哪一行,以便我們能夠弄清楚確切地說null應該不是null。因此,如果錯誤在第73行,您應該指出哪一行是第73行。 – dcsohl

+0

最可能的原因是您在SD_PATH上沒有.mp3文件,或者您的Mp3Filter不起作用 – NitroNbg

+0

@NitroNbg我的文件SD_PAth和Mp3Filter應該可以工作。我認爲出現錯誤是因爲SD_Path是錯誤的路徑 –

回答

2

這裏是您的解決方案使用下面的代碼來讀取特定的文件夾MP3文件..

首先創建1個模型類如下給出,以GETSET列表中的文件。

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

來讀取特定文件夾中的文件,使用下面的查詢和寫在查詢您的文件夾名..

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

不要忘記添加存儲權限..享受。