У меня есть класс, который воспроизводит аудиофайлы, расположенные в некоторых папках... Проблема в том, что я не могу использовать только один экземпляр медиаплеера для воспроизведения нескольких аудиофайлов. Каждый раз, когда я пытаюсь воспроизвести другую песню, создается новый экземпляр класса Media, и новая песня воспроизводится параллельно с предыдущей, что очень раздражает... Может ли кто-нибудь помочь мне использовать только один экземпляр Media Payer для воспроизводить разные песни одну за другой, как в обычных аудиоплеерах
//The files are listed as an array into a ListView, so i added a ListView.OnItemClickListener to play that location which the user has selected
ListView audiolist=(ListView)findViewById(R.id.audiolist);
audiolist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position==id){
File mypath=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
String mystring=(String)audiolist.getItemAtPosition(position);
if (mystring.contains(".mp3")) {
File myfile = new File(mypath.toString(), "/" + mystring);
Uri newuri = Uri.fromFile(myfile);
//I think this line is the one creating the mutiple instances of the MediaPayer
mp=new MediaPlayer();
mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mp.setAudioAttributes(
new AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
try {
mp.setDataSource(getApplicationContext(),newuri);
mp.setDisplay(holder);
mp.prepare();
mp.setOnBufferingUpdateListener(Audio_Player.this);
mycontroller=new MediaController(Audio_Player.this);
mycontroller.setMediaPlayer(Audio_Player.this);
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
}//end of if
});//end of listview method
Первопричина
Каждый раз, когда пользователи нажимают на элемент ListView
, вы всегда создаете новый экземпляр MediaPlayer
и не останавливаете текущий. Это объясняет, почему вы видите, что несколько аудио воспроизводятся одновременно.
Решение
Просто создайте новый экземпляр MediaPlayer
, если его нет, в противном случае остановите текущий, прежде чем играть в новый. Измените свой код с
File mypath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
String mystring = (String)audiolist.getItemAtPosition(position);
if (mystring.contains(".mp3")) {
File myfile = new File(mypath.toString(), "/" + mystring);
Uri newuri = Uri.fromFile(myfile);
// I think this line is the one creating the mutiple instances of the MediaPayer
mp = new MediaPlayer();
mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mp.setAudioAttributes(
new AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
try {
mp.setDataSource(getApplicationContext(),newuri);
mp.setDisplay(holder);
mp.prepare();
mp.setOnBufferingUpdateListener(Audio_Player.this);
mycontroller=new MediaController(Audio_Player.this);
mycontroller.setMediaPlayer(Audio_Player.this);
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
}
к
File mypath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
String mystring = (String) audiolist.getItemAtPosition(position);
if (mystring.contains(".mp3")) {
File myfile = new File(mypath.toString(), "/" + mystring);
Uri newuri = Uri.fromFile(myfile);
// I think this line is the one creating the mutiple instances of the MediaPayer
// Create a new MediaPlayer instance if there is no one existing.
if (mp == null) {
mp = new MediaPlayer();
mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
AudioAttributes.Builder builder = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA);
mp.setAudioAttributes(builder.build());
mp.setOnBufferingUpdateListener(Audio_Player.this);
mycontroller = new MediaController(Audio_Player.this);
mycontroller.setMediaPlayer(Audio_Player.this);
mp.setDisplay(holder);
}
// If the MediaPlayer is playing, then stop it and switch to another audio,
try {
if (mp.isPlaying()) {
mp.reset();
}
mp.setDataSource(getApplicationContext(), newuri);
mp.prepare();
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
}//end of if