我正在尝试在android studio中制作一个音乐应用程序。我的应用程序运行得很好,除了它有一个小bug。在我的主要活动中,我有一个歌曲列表,这些歌曲是我从resources文件夹中的raw文件夹导入的。我的第二个窗口是一个NowPlaying java文件,我可以在其中暂停、前进和查看歌曲的歌词。
当我播放主活动中的第一首歌曲时,它工作得很好。但是,当我想要播放第二首歌曲时,因为正在播放第一首歌曲,所以第二首歌曲会在第一首歌曲的顶部播放。歌词更新了,搜索栏也更新了,但是两首歌在一起播放。但是,当我暂停第一首歌曲,返回到主要活动并播放第二首歌曲时,这种情况不会发生。

我使用:

if(song != null){
if(song.isPlaying()){
song.reset(); song = null;
}
}我知道我的NowPlaying.java文件中有一个错误:所以下面是完整的代码:
PS。我只是在一个学习的过程中。
MediaPlayer song = null;
SeekBar seekBar;
Intent intent = getIntent();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_now_playing);
seekBar = (SeekBar) findViewById(R.id.seekBar);
//String selectedSong = getIntent().getExtras().getString("selectSong");
selectSong();
//for pause button
pauseButton();
//for songtile
getSongtitle();
getSongList();
getNextButton();
getPreviousButton();
} // end of onCreate method
/**
* Method for selecting the song
* Moves to startSong method
*/
public void selectSong(){
TextView lyricsBox = (TextView) findViewById(R.id.lyricsBox);
lyricsBox.setMovementMethod(new ScrollingMovementMethod());
String nextPlay = intent.getStringExtra("playSong");
if(song != null){
if(song.isPlaying()){
song.reset();
song = null;
}
}
if (nextPlay.equals("Demons")) {
song = MediaPlayer.create(this, R.raw.demons);
lyricsBox.setText(R.string.demonsLyrics);
} else if (nextPlay.equals("Black Space")) {
song = MediaPlayer.create(this, R.raw.blankspace);
lyricsBox.setText(R.string.blankspaceLyrics);
} else if (nextPlay.equals("Case 420")) {
song = MediaPlayer.create(this, R.raw.case420);
lyricsBox.setText(R.string.case420Lyrics);
}
else if(nextPlay.equals("Jalma")){
song = MediaPlayer.create(this, R.raw.jalma);
lyricsBox.setText(R.string.jalmaLyrics);
}
else if(nextPlay.equals("Parelima")){
song = MediaPlayer.create(this, R.raw.parelima);
lyricsBox.setText(R.string.parelimaLyrics);
}
else if(nextPlay.equals("Mero Balyakal Ko Sathi")){
song = MediaPlayer.create(this, R.raw.balyakalsathi);
lyricsBox.setText(R.string.balyakalSathi);
}
else if(nextPlay.equals("Euta Sathi")){
song = MediaPlayer.create(this, R.raw.eutasathi);
}
else if(nextPlay.equals("Audai Jadai")){
song = MediaPlayer.create(this, R.raw.audaijadai);
}
else if(nextPlay.equals("Cheerleader")){
song = MediaPlayer.create(this, R.raw.cheerleader);
}
// to start playing the song
startButton();
}
//method to make sure seekbar updates till song ends
Runnable run = new Runnable() {
@Override
public void run() {
getseekBar();
}
};
/**
* Method to start song (play the song)
*
*/
public void startButton() {
song.start();
//to update seek bar
getseekBar();
}
/**
* Method to update the seekbar.
* implement touch in seekbar to change song position
*/
public void getseekBar() {
seekBar.setMax(song.getDuration());
seekBar.setProgress(song.getCurrentPosition());
seekBar.postDelayed(run, 1000);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
int seek_to;
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
seek_to = progress;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
song.seekTo(seek_to);
}
});
}
/**
* Method for pause Button
* to pause song once clicked and change button background to play image
* Again play the song if the button is pressed again. and change background back to pause image
*/
public void pauseButton(){
final Button playButton = (Button) findViewById(R.id.playButton);
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (song.isPlaying()) {
playButton.setBackgroundResource(R.drawable.playbutton);
song.pause();
} else {
playButton.setBackgroundResource(R.drawable.pausebutton);
song.start();
}
}
});
}
/**
* Method to get the song title from first java file and display in the title
*/
public void getSongtitle(){
Intent intent = getIntent();
String nextPlay = intent.getStringExtra("playSong");
TextView Songtitle = (TextView) findViewById(R.id.Songtitle);
Songtitle.setText(nextPlay);
}
/**
* Method for song list button
* Goes back to the first java file once the button is cliked,
* displays the song list
*/
public void getSongList(){
Button lyricsButton = (Button) findViewById(R.id.lyricsButton);
lyricsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(NowPlaying.this, MainActivity.class));
}
});
}
/**
* Method for next button
* the song skips every 10 seconds once clicked
*/
public void getNextButton(){
Button nextButton = (Button) findViewById(R.id.nextButton);
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int startTime = song.getCurrentPosition();
int forwardTime = 10000;
startTime += forwardTime;
if(startTime <= song.getDuration()){
song.seekTo(startTime);
}
else{
song.stop();
}
}
});
} // end of getNextButton
/**
* Method for previous button
* the song skips back 10 seconds once clicked
*/
public void getPreviousButton(){
Button previousButton = (Button) findViewById(R.id.previousButton);
previousButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int startTime = song.getCurrentPosition();
int previousTime = 10000;
startTime -= previousTime;
if(startTime >= 0){
song.seekTo(startTime);
}
else{
song.seekTo(0);
song.start();
}
}
});
}主要活动的代码:
公共类MainActivity扩展了AppCompatActivity {
String[] songList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
populateList();
}
private void populateList(){
songList = new String[] {"Jalma", "Demons", "Parelima", "Mero Balyakal Ko Sathi", "Audai Jadai",
"Case 420", "Euta Sathi", "Cheerleader"};
ListAdapter arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
songList);
ListView theList = (ListView) findViewById(R.id.theList);
theList.setAdapter(arrayAdapter);
theList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ListView theList = (ListView) findViewById(R.id.theList);
startActivity(new Intent(MainActivity.this, NowPlaying.class));
String selectedSong = (String) (theList.getItemAtPosition(position));
Intent toSecondActivity = new Intent(getApplicationContext(), NowPlaying.class);
toSecondActivity.putExtra("playSong", selectedSong);
startActivity(toSecondActivity);
}
});
}}
发布于 2019-05-06 22:23:28
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_now_playing);
.......
@Override
public void onDestroy(){
if(song.isplaying())
{
song.pause();
song.release();
}
super.onDestroy();
}
}您没有销毁此活动的实例,当您暂停歌曲后,它将仅以该活动开始,因此请确保您销毁了此活动的实例,请遵循this tutorial
发布于 2015-11-01 08:04:21
如果没有MainActivity类,我不能确定,但似乎您在NowPlaying中使用的不是相同的MediaPlayer实例,所以我只能假设您已经为这两个活动创建了一个新实例。
这可能意味着原始实例在第一个活动中仍处于活动状态。
如果是这样,您可以在切换活动之前销毁MediaPlayer的MainActivity实例,或者跨两个活动使用相同的实例。
我会推荐第二个选项,如果你只想一次播放一首歌,这是有意义的,然后看看Singleton类。我相信这在这种情况下会工作得很好。
http://www.javaworld.com/article/2073352/core-java/simply-singleton.html
编辑:
试一试,
theList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String selectedSong = (String) (theList.getItemAtPosition(position));
Intent toSecondActivity = new Intent(MainActivity.this, NowPlaying.class);
toSecondActivity.putExtra("playSong", selectedSong);
startActivity(toSecondActivity);
}
});并且您需要将theList作为最终版本
发布于 2018-02-26 19:35:43
I am also facing the same issue.Songs are playing on top of each other. Finally I found the answer from a video.
https://www.youtube.com/watch?v=4DC4XFWVFls
//For Play Button OnClick Listener
public void onClick(View v) {
if(mediaPlayer !=null)
{
mediaPlayer.release();
}
mediaPlayer = MediaPlayer.create(context, songList.getSong());
mediaPlayer.start();
}
//For Stop Button
public void onClick(View v) {
mediaPlayer.stop();
}
This code worked properly for me.https://stackoverflow.com/questions/33457359
复制相似问题