我正在开发Android中的音乐播放器,但仍然在阅读MP3文件。 这是我读取所有mp3文件的代码。但它不会从设备中撤回任何文件(尽管我使用adb复制了一些文件)。我也希望它使用专辑,艺术家等列出。请帮助。
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 :(得分:9)
这里我修改了你的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);
}
}
}
注意:使用“/ storage / sdcard1 /”从sdCard读取文件并使用Environment.getExternalStorageDirectory()。getAbsolutePath()从手机内存中读取文件
希望这会对你有所帮助。
答案 1 :(得分:2)
试试这个
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);
}
}
}
}
答案 2 :(得分:2)
希望你已经找到了答案,但可能会更好,如果你想尝试,这是你的解决方案使用以下代码从特定文件夹或所有文件中读取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;
}
}
现在我们有了Model Class,使用下面的代码来读取文件夹或设备中的所有MP3文件。
这将返回包含音乐NAME, PATH, ARTIST, ALBUM
的所有MP3文件的列表。如果您想了解更多详情,请参阅documentation for Media.Store.Audio
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);
不要忘记添加存储权限。
答案 3 :(得分:-1)
8+2+3+0+7