2015-10-31 6 views
0

Я пытаюсь создать музыкальное приложение в студии Android. Мое приложение прекрасно работает, но у него небольшая ошибка. В моей основной деятельности у меня есть список песен, которые я импортировал из своей сырой папки в папке ресурсов. Мое второе окно - это Java-файл NowPlaying, где я могу приостановить, переслать и увидеть тексты песен.Ошибка в приложении для музыки (Media Player) в студии Android

Когда я воспроизвожу первую песню из Основной деятельности, она работает нормально. Но, когда я хочу сыграть вторую песню, когда играет первая песня, вторая песня играет поверх первой песни. Лирика обновляется, поисковая панель обновляется, но две песни играют вместе. Однако этого не происходит, когда я приостанавливаю первую песню, вернусь к основной деятельности и воспроизведу вторую песню. enter image description here я использовал: enter image description here

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

пожалуйста, напишите код для MainActivity.java –

+0

Можете ли вы поместить Log.d в onCreate(), чтобы узнать, сколько раз он звонит редактор – surlac

ответ

0

Ну без класса MainActivity я не могу быть уверен, но это Безразлично» t похоже, что вы используете тот же экземпляр MediaPlayer в NowPlaying, поэтому я могу только предположить, что вы создали новый экземпляр для обоих действий.

Что, вероятно, означает, что исходный экземпляр все еще активен в первом действии.

Если это так, вы можете либо уничтожить экземпляр MainActivity MediaPlayer перед переключением действий, либо использовать один и тот же экземпляр для обоих действий.

Я бы порекомендовал второй вариант, если вы когда-либо захотите сыграть одну песню за раз, имеет смысл, если хотите, а затем взгляните на классы Singleton. Я считаю, что в этой ситуации все будет хорошо.

http://www.javaworld.com/article/2073352/core-java/simply-singleton.html

EDIT:

Дайте этому идти,

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

+0

Вот код для основной деятельности: –

+0

Не могли бы вы проверить основной код активности и помочь мне –

+0

Я отредактировал мое сообщение, вы должны прочитать это, чтобы объяснить, почему вы не должны использовать getApplicationContext так, как вы это делали. http://stackoverflow.com/questions/33447762/difference-btn-mcontext-get-getapplicationcontext-and-getactivity/33447949#33447949 – BrendanDodd

0
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. 
+0

Этот код не будет работать, так как у вас есть два 'onClick (View v)' те же методы. – arcticwhite

+0

@arcticwhite .. У меня есть две кнопки для воспроизведения и остановки –

+0

Да, у вас есть две кнопки, но у вас также есть два одинаковых метода. Итак, как ваша кнопка знает, какой из них вы нажали? – arcticwhite

 Смежные вопросы

  • Нет связанных вопросов^_^