在 Android Studio 中使用 OnCompletionListener 播放多个媒体播放器
Playing Multiple Mediaplayers with OnCompletionListener in Android Studio
帮助我,我是初学者,我正在尝试制作一个应用程序,其中有需要播放的音频,我尝试使用MediaPlayer,所以为了可以播放和暂停音频,我在调用音频文件夹时使用 setOnCompletion 和数组方法实现了这 3 个媒体播放器,如下所示:
mediaPlayer.setOnCompletionListener(completionListener);
MediaPlayer.OnCompletionListener completionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
play++;
if (play < playList.length) {
mediaPlayer = MediaPlayer.create(BackGroundSound.this, playList[play]);
mediaPlayer.start();
} else {
play = 0;
mediaPlayer = MediaPlayer.create(BackGroundSound.this, playList[play]);
mediaPlayer.start();
}
}
};
文件 MediaPlayer 的数组:
int[] playList = new int[3];
playList[0] = R.raw.madtarqiqc1;
playList[1] = R.raw.madtarqiqc2;
playList[2] = R.raw.madtarqiqc3;
但是当我点击按钮时,我制作的程序不起作用,媒体层和按钮没有反应,我应该添加什么,我已经重新设计了这段代码很多次但是结果还是一样,有没有漏掉的代码或方法?
这是我拥有的完整源代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
MediaPlayer mediaPlayer;
ImageButton btn1, btn2, btn3;
int[] playList;
int play = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (ImageButton) findViewById(R.id.play_toggle_ratarqiq1);
btn2 = (ImageButton) findViewById(R.id.play_toggle_ratarqiq2);
btn3 = (ImageButton) findViewById(R.id.play_toggle_ratarqiq3);
int[] playList = new int[3];
playList[0] = R.raw.madtarqiqc1;
playList[1] = R.raw.madtarqiqc2;
playList[2] = R.raw.madtarqiqc3;
mediaPlayer = MediaPlayer.create(this, playList[play]);
mediaPlayer.setOnCompletionListener(completionListener);
}
MediaPlayer.OnCompletionListener completionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
play++;
if (play < playList.length) {
mediaPlayer = MediaPlayer.create(MainActivity.this, playList[play]);
mediaPlayer.start();
} else {
play = 0;
mediaPlayer = MediaPlayer.create(MainActivity.this, playList[play]);
mediaPlayer.start();
}
}
};
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.play_toggle_ratarqiq1:
playMusic(0);
break;
case R.id.play_toggle_ratarqiq2:
playMusic(1);
break;
case R.id.play_toggle_ratarqiq3:
playMusic(2);
break;
}
}
private void playMusic(int position) {
mediaPlayer.stop();
mediaPlayer = MediaPlayer.create(this, playList[position]);
mediaPlayer.start();
changeView(position);
}
private void changeView(int position) {
if (position == 0) {
btn1.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
} else if (position == 1) {
btn1.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
} else if (position == 2) {
btn1.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
}
}
}
您错过的关键事情很少:
- 在那些
Button
个对象中设置 onClickListner()
- 重用
MediaPlayer
实例(您每次需要时都创建一个新实例)
- 正确更新
play
变量,我认为它是当前播放歌曲的索引
我尽量让它完全可读。这是 MainActivity
的代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private MediaPlayer mediaPlayer;
private ImageButton btn1, btn2, btn3;
private int[] playList;
// initializing it to -1 so that it is out of bounds of the array playList
private int play = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = findViewById(R.id.play_toggle_ratarqiq1);
btn2 = findViewById(R.id.play_toggle_ratarqiq2);
btn3 = findViewById(R.id.play_toggle_ratarqiq3);
// you forgot to setonclicklistener in these buttons thats why they were not reponding
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
playList = new int[3];
playList[0] = R.raw.madtarqiqc1;
playList[1] = R.raw.madtarqiqc2;
playList[2] = R.raw.madtarqiqc3;
// use constructor to create a mediaplayer object rather than this static create method
// mediaPlayer = MediaPlayer.create(this, playList[play]);
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnCompletionListener(completionListener);
}
MediaPlayer.OnCompletionListener completionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
play++;
if (play < playList.length) {
// we will not assign mediaPlayer to new instance instead we will only change data source
// and reuse the single instance everywhere in this activity
// mediaPlayer = MediaPlayer.create(MainActivity.this, playList[play]);
try {
mediaPlayer.setDataSource(MainActivity.this, Uri.parse("android.resource://" + getPackageName() + "/res/raw/"
+ getResources().getResourceName(playList[play])));
mediaPlayer.start();
} catch (IOException e) {
// if things goes wrong we will show Toast
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
} else {
play = 0;
try {
mediaPlayer.setDataSource(MainActivity.this, Uri.parse("android.resource://" + getPackageName() + "/res/raw/"
+ getResources().getResourceName(playList[play])));
mediaPlayer.start();
} catch (IOException e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
};
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.play_toggle_ratarqiq1:
// you can check to see if the song that we want to play is already being played
// so that in that case you can pause it and resume on next click later
// but I leave it to you for the implementation
playMusic(0);
break;
case R.id.play_toggle_ratarqiq2:
playMusic(1);
break;
case R.id.play_toggle_ratarqiq3:
playMusic(2);
break;
}
}
private void playMusic(int position) {
// with the code below, for the first time the mediaplayer wouldn't have started playing
// and you would have already called stop() on it.
// mediaPlayer.stop();
// Also, assigning mediaPlayer obj to new instance will wipe out the onCompletionListener
// you set earlier.
// mediaPlayer = MediaPlayer.create(this, playList[position]);
// check to see if mediaplayer is playing to reset it if it is
if (mediaPlayer.isPlaying() || mediaPlayer.)
mediaPlayer.reset();
// now that it is in idle state, set data source in it
try {
mediaPlayer.setDataSource(this, Uri.parse("android.resource://" + getPackageName() + "/res/raw/"
+ getResources().getResourceName(playList[position])));
// start playback and change btn images accordingly
mediaPlayer.start();
changeView(position);
// also you forgot to update play variable to indicate the index of current song
// that is being played
play = position;
} catch (IOException e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
private void changeView(int position) {
// I guess this needs a little bit of modification as
// For eg: if btn1 is clicked, btn1 should show pause img in theory
// same goes for all other buttons
// try to handle it yourself
if (position == 0) {
btn1.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
} else if (position == 1) {
btn1.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
} else if (position == 2) {
btn1.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// releasing the mediaplayer is must so that you do not leak resources
if (mediaPlayer != null)
mediaPlayer.release();
}
}
帮助我,我是初学者,我正在尝试制作一个应用程序,其中有需要播放的音频,我尝试使用MediaPlayer,所以为了可以播放和暂停音频,我在调用音频文件夹时使用 setOnCompletion 和数组方法实现了这 3 个媒体播放器,如下所示:
mediaPlayer.setOnCompletionListener(completionListener);
MediaPlayer.OnCompletionListener completionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
play++;
if (play < playList.length) {
mediaPlayer = MediaPlayer.create(BackGroundSound.this, playList[play]);
mediaPlayer.start();
} else {
play = 0;
mediaPlayer = MediaPlayer.create(BackGroundSound.this, playList[play]);
mediaPlayer.start();
}
}
};
文件 MediaPlayer 的数组:
int[] playList = new int[3];
playList[0] = R.raw.madtarqiqc1;
playList[1] = R.raw.madtarqiqc2;
playList[2] = R.raw.madtarqiqc3;
但是当我点击按钮时,我制作的程序不起作用,媒体层和按钮没有反应,我应该添加什么,我已经重新设计了这段代码很多次但是结果还是一样,有没有漏掉的代码或方法?
这是我拥有的完整源代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
MediaPlayer mediaPlayer;
ImageButton btn1, btn2, btn3;
int[] playList;
int play = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (ImageButton) findViewById(R.id.play_toggle_ratarqiq1);
btn2 = (ImageButton) findViewById(R.id.play_toggle_ratarqiq2);
btn3 = (ImageButton) findViewById(R.id.play_toggle_ratarqiq3);
int[] playList = new int[3];
playList[0] = R.raw.madtarqiqc1;
playList[1] = R.raw.madtarqiqc2;
playList[2] = R.raw.madtarqiqc3;
mediaPlayer = MediaPlayer.create(this, playList[play]);
mediaPlayer.setOnCompletionListener(completionListener);
}
MediaPlayer.OnCompletionListener completionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
play++;
if (play < playList.length) {
mediaPlayer = MediaPlayer.create(MainActivity.this, playList[play]);
mediaPlayer.start();
} else {
play = 0;
mediaPlayer = MediaPlayer.create(MainActivity.this, playList[play]);
mediaPlayer.start();
}
}
};
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.play_toggle_ratarqiq1:
playMusic(0);
break;
case R.id.play_toggle_ratarqiq2:
playMusic(1);
break;
case R.id.play_toggle_ratarqiq3:
playMusic(2);
break;
}
}
private void playMusic(int position) {
mediaPlayer.stop();
mediaPlayer = MediaPlayer.create(this, playList[position]);
mediaPlayer.start();
changeView(position);
}
private void changeView(int position) {
if (position == 0) {
btn1.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
} else if (position == 1) {
btn1.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
} else if (position == 2) {
btn1.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
}
}
}
您错过的关键事情很少:
- 在那些
Button
个对象中设置onClickListner()
- 重用
MediaPlayer
实例(您每次需要时都创建一个新实例) - 正确更新
play
变量,我认为它是当前播放歌曲的索引
我尽量让它完全可读。这是 MainActivity
的代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private MediaPlayer mediaPlayer;
private ImageButton btn1, btn2, btn3;
private int[] playList;
// initializing it to -1 so that it is out of bounds of the array playList
private int play = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = findViewById(R.id.play_toggle_ratarqiq1);
btn2 = findViewById(R.id.play_toggle_ratarqiq2);
btn3 = findViewById(R.id.play_toggle_ratarqiq3);
// you forgot to setonclicklistener in these buttons thats why they were not reponding
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
playList = new int[3];
playList[0] = R.raw.madtarqiqc1;
playList[1] = R.raw.madtarqiqc2;
playList[2] = R.raw.madtarqiqc3;
// use constructor to create a mediaplayer object rather than this static create method
// mediaPlayer = MediaPlayer.create(this, playList[play]);
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnCompletionListener(completionListener);
}
MediaPlayer.OnCompletionListener completionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
play++;
if (play < playList.length) {
// we will not assign mediaPlayer to new instance instead we will only change data source
// and reuse the single instance everywhere in this activity
// mediaPlayer = MediaPlayer.create(MainActivity.this, playList[play]);
try {
mediaPlayer.setDataSource(MainActivity.this, Uri.parse("android.resource://" + getPackageName() + "/res/raw/"
+ getResources().getResourceName(playList[play])));
mediaPlayer.start();
} catch (IOException e) {
// if things goes wrong we will show Toast
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
} else {
play = 0;
try {
mediaPlayer.setDataSource(MainActivity.this, Uri.parse("android.resource://" + getPackageName() + "/res/raw/"
+ getResources().getResourceName(playList[play])));
mediaPlayer.start();
} catch (IOException e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
};
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.play_toggle_ratarqiq1:
// you can check to see if the song that we want to play is already being played
// so that in that case you can pause it and resume on next click later
// but I leave it to you for the implementation
playMusic(0);
break;
case R.id.play_toggle_ratarqiq2:
playMusic(1);
break;
case R.id.play_toggle_ratarqiq3:
playMusic(2);
break;
}
}
private void playMusic(int position) {
// with the code below, for the first time the mediaplayer wouldn't have started playing
// and you would have already called stop() on it.
// mediaPlayer.stop();
// Also, assigning mediaPlayer obj to new instance will wipe out the onCompletionListener
// you set earlier.
// mediaPlayer = MediaPlayer.create(this, playList[position]);
// check to see if mediaplayer is playing to reset it if it is
if (mediaPlayer.isPlaying() || mediaPlayer.)
mediaPlayer.reset();
// now that it is in idle state, set data source in it
try {
mediaPlayer.setDataSource(this, Uri.parse("android.resource://" + getPackageName() + "/res/raw/"
+ getResources().getResourceName(playList[position])));
// start playback and change btn images accordingly
mediaPlayer.start();
changeView(position);
// also you forgot to update play variable to indicate the index of current song
// that is being played
play = position;
} catch (IOException e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
private void changeView(int position) {
// I guess this needs a little bit of modification as
// For eg: if btn1 is clicked, btn1 should show pause img in theory
// same goes for all other buttons
// try to handle it yourself
if (position == 0) {
btn1.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
} else if (position == 1) {
btn1.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
} else if (position == 2) {
btn1.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn2.setImageResource(R.drawable.ic_pause_circle_outline_black_24dp);
btn3.setImageResource(R.drawable.ic_play_circle_outline_black_24dp);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// releasing the mediaplayer is must so that you do not leak resources
if (mediaPlayer != null)
mediaPlayer.release();
}
}