Это моя AsyncTask
class loadSongs extends AsyncTask<String, Void, ArrayList<HashMap<String, String>>> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> hashMaps) {
super.onPostExecute(hashMaps);
songList1 = hashMaps;
progressBar.setVisibility(View.GONE);
}
@Override
protected ArrayList<HashMap<String, String>> doInBackground(String... params) {
listdir(Environment.getExternalStorageDirectory());
return null;
}
public 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<>();
Log.d("file path", "" + file.getAbsolutePath());
song.put("file_path", file.getAbsolutePath());
Log.d("file name playlist", "" + file.getName());
song.put("file_name", file.getName());
fileList.add(song);
}
}
return fileList;
} catch (Exception e) {
return null;
}
}
}
}
выполнить Aysnck в вас классе
new loadSongs().execute();
Вот метод listdir
public void listdir(File dir) {
String msqPattern = ".mp3";// Can include more strings for more extensions and check it.
File[] listFile = dir.listFiles();
if (listFile != null) {
for (int i = 0; i < listFile.length; i++) {
if (listFile[i].isDirectory()) {
listdir(listFile[i]);
} else {
if (listFile[i].getName().endsWith(msqPattern)) {
Music_File_Name.add(listFile[i].getName());
Music_File_Path.add(listFile[i].getAbsolutePath());
}
}
}
}
}
Вот адаптер класса
public class DeafaultMusic_Adapter extends BaseAdapter {
LayoutInflater layoutInflater;
ArrayList<String> list, path;
Context context;
MediaPlayer mpintro;
public DeafaultMusic_Adapter(Context context, ArrayList<String> list, ArrayList<String> path) {
this.context = context;
this.path = path;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public String getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
layoutInflater = LayoutInflater.from(context);
convertView = layoutInflater.inflate(R.layout.music_list, parent, false);
TextView title = (TextView) convertView.findViewById(R.id.songTitle);
TextView album = (TextView) convertView.findViewById(R.id.songAlbum);
ImageView icon = (ImageView) convertView.findViewById(R.id.icon);
title.setText(list.get(position));
icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(Model.mediaPlayer.isPlaying())
{
Model.mediaPlayer.stop();
Model.mediaPlayer=MediaPlayer.create(context,Uri.parse(path.get(position)));
Model.mediaPlayer.start();
}
else {
Model.mediaPlayer=MediaPlayer.create(context,Uri.parse(path.get(position)));
Model.mediaPlayer.start();
}
}
});
return convertView;
}
}
я использовал GridView вместо ListView, как этот
DeafaultMusic_Adapter adapter = new DeafaultMusic_Adapter(c, Music_File_Name, Music_File_Path);
Log.d("music file name", "" + Music_File_Name);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(c, CropMusic.class);
i.putExtra("musicPath", "" + Music_File_Path.get(position));
i.putExtra("musicName", "" + Music_File_Name.get(position));
startActivity(i);
activity.overridePendingTransition(R.anim.activity_in,R.anim.activity_out);
}
});
на музыку нажмите я передаю музыку путь к следующему acticity и воспроизвести его в музыкальный проигрыватель
Вы можете воспроизводить музыку из списка, например,
icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(Model.mediaPlayer.isPlaying())
{
Model.mediaPlayer.stop();
Model.mediaPlayer=MediaPlayer.create(context,Uri.parse(path.get(position)));
Model.mediaPlayer.start();
}
else {
Model.mediaPlayer=MediaPlayer.create(context,Uri.parse(path.get(position)));
// mpintro.setLooping(true);
Model.mediaPlayer.start();
}
}
});
здесь значок мой imageveiw с игры значок
в этом методе я глобально определить MusicPlayer oblject таким образом мы можем сбросить его, когда следующая музыка выбрать
public class Model
{
public static MediaPlayer mediaPlayer = new MediaPlayer();
}
комментарий ниже, если любой запрос
Возможный дубликат из [Как получить доступ ко всем mp3-файлам из всех подпапок в SD-карте?] (http://stackoverflow.com/questions/17210519/how-to-access-all-mp3-files-from-all-the-subfolders- in-the-sdcard) – darwin
Я предлагаю разбивать вашу проблему на более мелкие части. 1) Как создать список с «фиктивными» элементами. 2) Как получить доступ к mp3-файлам из внутреннего хранилища. Тогда как поставить 1 и 2 вместе? Я не думаю, что кто-то собирается написать программу для вас ... но я могу сказать, что вам, вероятно, понадобится List, который помещается в адаптер, связанный с listview. Затем вам нужно выяснить, как добавить файлы MP3 в этот список. Я бы предложил что-то вроде проверки канала YouTube «slidenerd» и поискать видео в списках просмотров. –
Я отредактировал вопрос. Можете ли вы проверить, что не так с кодом? Все еще немного смущен. Приложение терпит крах. – Kyle