我正在尝试在android studio中制作音乐应用程序。我的应用程序工作正常,除了它有一个小bug。在我的主要活动中,我有一个歌曲列表,我从资源文件夹中的原始文件夹导入。我的第二个窗口是一个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);
}
});
}
}
答案 0 :(得分:1)
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
答案 1 :(得分:0)
没有MainActivity类我不能确定,但是看起来你在NowPlaying中没有使用相同的MediaPlayer实例,所以我只能假设你为这两个活动创建了一个新实例。
这可能意味着原始实例在第一个Activity中仍处于活动状态。
如果是这样,您可以在切换活动之前销毁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);
}
});
,您需要将列表设为最终