2017-09-10 75 views
1

私はこの質問がここで多くの時間をお答えしているのを見ました。しかし、私は問題があります。 音楽プレーヤーが起動すると、最初のトラックをスキップして自動的に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番目の曲を再生します。

+0

あなたのnextSong()を投稿してください。とplaySong();フィクションも。 –

+0

私はそれらを追加しましたあなたは今見てみることができます –

+0

これらの関数を呼び出す場所全体のコードを投稿します。 –

答えて

0

ここで正確にアーカイブする対象がわからない場合は、playSong();の両方を呼び出すのではなく、電話することができます。

void initMediaPlayer(){ 
mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mediaPlayer) { 
     try { 

      playSong(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}); 
} 
+0

すでに演奏中の場合は次の曲を演奏したい。私の音楽プレーヤーは、アプリケーションを開くとすぐに2番目の曲を再生します。 –

0
void initMediaPlayer() { 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mediaPlayer) { 
       try { 

        nextSong(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     try { 
      playSong(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

私の側にいるとの演奏罰金を試してみてください。

関連する問題