我正在尝试为我的闹钟应用程序设置铃声。为此,我需要显示SD卡中各种文件夹和子文件夹中存在.mp3扩展名的所有歌曲。
我只想显示.mp3文件,而不是任何文件夹/子文件夹。我已经有一个编码,其中歌曲从SD卡显示,而不是从子文件夹中显示。 所有给定的编码仅从我不需要的特定文件夹中检索歌曲。我需要SD卡中存在的每首mp3歌曲。
public class Mp3filterActivity extends Activity{
final String MEDIA_PATH = new String("/sdcard/");
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listsong =(ListView)findViewById(R.id.songlist);
ArrayList<String> mp3list = new ArrayList<String>();
mp3list=mp3select();
Toast.makeText(this, "mp3files" +mp3list, Toast.LENGTH_LONG).show();
ArrayAdapter<String> listAdapter=new ArrayAdapter<String>(Mp3filterActivity.this,android.R.layout.simple_list_item_1,mp3list);
listsong.setAdapter(listAdapter);
}
public ArrayList<String> mp3select(){
File home = new File(MEDIA_PATH);
ArrayList<String> list = new ArrayList<String>();
//if (home.isDirectory())
if (home.listFiles(new FileExtensionFilter()).length > 0)
{
for (File file : home.listFiles(new FileExtensionFilter()))
{
list.add(file.getName().substring(0, (file.getName().length() - 4)));
}
}
return list;
}
class FileExtensionFilter implements FilenameFilter
{
public boolean accept(File dir, String name) {
return (name.endsWith(".mp3") ||name.endsWith(".MP3"));
}
}
}
首先,不要对/sdcard/
进行硬编码,因为SDcard可能不会挂载在该目录下。请改用Environment.getExternalStorageDirectory()
方法。另外,首先检查是否有SD卡。
您无需爬网所有这些文件夹即可获取设备上的每个音频文件(外部和内部)。Android 公开了以下MediaStore
:
[...]包含内部和外部存储设备上所有可用介质的元数据。
它有一个用于所有特定于音频的操作的MediaStore.Audio
子类。
您必须递归遍历每个文件夹才能实现此目的。
示例代码如下所示:
getMp3s(Arraylist<File> list, File dir){
File[] files = dir.listFiles();
for(File file : files){
if(file.isDirectory()){
getMp3s(list, file);
}else{
//add mp3s to list here
}
}
}
MediaStore
比扫描SD卡更好,因此您可以获得,Albums
,Artist
,Path
等,尝试尽最大努力:)