私はこの質問がここで多くの時間をお答えしているのを見ました。しかし、私は問題があります。 音楽プレーヤーが起動すると、最初のトラックをスキップして自動的に2番目のトラックの再生を開始します。メディアプレーヤーで自動的に次の曲を再生するには?
通常の音楽のように振る舞いたい。
public class MusicService extends Service {
private final MediaPlayer mp = new MediaPlayer();
private final IBinder localBinder = new LocalBinder();
ArrayList<Song> songs = new ArrayList<>();
boolean firstAttempt = true;
public MusicService() {
}
@Override
public IBinder onBind(Intent intent) {
return localBinder;
}
public class LocalBinder extends Binder{
MusicService getService(){
return MusicService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
setSongsList();
initMediaPlayer();
}
void initMediaPlayer(){
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
try {
if(firstAttempt){
firstAttempt = false;
}else{
nextSong();
playSong();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
void setSongsList(){
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
String sortOrder = MediaStore.MediaColumns.DISPLAY_NAME+"";
String[] projection = {
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DURATION
};
Cursor cursor = getApplicationContext().getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
null,
sortOrder);
while(cursor.moveToNext()){
songs.add(new Song(cursor.getString(1), cursor.getString(0), cursor.getString(3), cursor.getString(2)));
}
}
Song getPlayingSong(){
return songs.get(nowPlaying);
}
//--------Song handlers start here--------
int nowPlaying = 0;
int seekLength = 0;
void playSong(int index) throws Exception {
if(index != nowPlaying){
seekLength = 0;
}
nowPlaying = index;
playSong();
}
void playSong() throws Exception {
mp.reset();
Uri path = Uri.parse(songs.get(nowPlaying).path);
mp.setDataSource(String.valueOf(path));
mp.prepare();
mp.seekTo(seekLength);
mp.start();
}
void pauseSong(){
mp.pause();
seekLength = mp.getCurrentPosition();
}
void nextSong() throws Exception {
nowPlaying = nowPlaying+1;
if (nowPlaying == songs.size()){
nowPlaying = 0;
}
seekLength = 0;
if(mp.isPlaying()){
playSong();
}
}
void prevSong() throws Exception {
nowPlaying = nowPlaying-1;
if(nowPlaying < 0){
nowPlaying = songs.size()-1;
}
seekLength = 0;
if(mp.isPlaying()){
playSong();
}
}
void queueSong(int index){
}
//-------------Returning MediaPlayer details-------------
boolean isPlaying(){
return mp.isPlaying();
}
int getDuration(){
return mp.getDuration();
}
int getCurrentPosition(){
return mp.getCurrentPosition();
}
void seekTo(int length){
seekLength = length;
mp.seekTo(length);
}
//------------Returning Song details----------
Song getSongByIndex(int index){
return songs.get(index);
}
}
私はそれが既に再生されている場合は、次の曲を再生したいです。私の音楽プレーヤーは、アプリケーションを開くとすぐに2番目の曲を再生します。
あなたのnextSong()を投稿してください。とplaySong();フィクションも。 –
私はそれらを追加しましたあなたは今見てみることができます –
これらの関数を呼び出す場所全体のコードを投稿します。 –