2013-09-17 3 views
0

У меня есть удаленный музыкальный поток, в котором URL-адрес изменяет каждую песню.
Я не хочу, чтобы пользователь дождался подготовки медиаплеера каждый раз, когда песня заканчивается.
Моей идеей реализовать это было создание двух экземпляров медиаплеера и загрузка следующей песни во время воспроизведения другого медиаплеера, и когда песня заканчивается, чтобы переключаться между ними и подготовить следующую песню к той, которая остановилась играть.Android Media Player продолжает передовую практику

Мне было интересно, если это будет лучшая практика, или есть другой способ достичь этого.

+1

Это звучит разумно, если вы используете API-интерфейс MediaPlayer. В API-интерфейсе 16 и выше вы можете использовать метод setNextMediaPlayer, чтобы сделать переход Android между двумя MediaPlayers максимально простым. В более старых версиях вы можете сделать переключатель в 'onCompletionListener'. – Michael

+0

@Michael Спасибо, мое приложение должно поддерживать API 8. Итак, мне нужно реализовать это самостоятельно. Изменение между ними, когда все готово, именно то, что я хотел. – RCB

ответ

1

Просто для справки, я сделал это так:

public MediaPlayer[] mediaPlayers; 
public MediaPlayer currentMediaPlayer; 
public MediaPlayer preloadMediaPlayer; 

вы можете инициализировать их:

private void initMediaPlayers() { 
    mediaPlayers = new MediaPlayer[MEDIA_PLAYER_COUNT]; 
    mediaPlayers[0] = createMediaPlayer(); 
    mediaPlayers[1] = createMediaPlayer(); 
    currentMediaPlayer = mediaPlayers[0]; 
    preloadMediaPlayer = mediaPlayers[1]; 
    currentPlayerIndex = 0; 
} 

createMediaPlayer просто вспомогательный метод:

private MediaPlayer createMediaPlayer() { 
    final MediaPlayer smp = new MediaPlayer(); 
    smp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
         //TODO: add your code here 
        } 

    }); 
    smp.setOnErrorListener(new MediaPlayer.OnErrorListener() { 
     public boolean onError(MediaPlayer mp, int what, int extra) { 
      //TODO: add your own error handling 
      return true; 
     } 
    }); 
      //TODO: add anything else you need 
    return smp; 
} 

Затем, если вы хотите обменять игроков:

private void swapPlayers() { 
    if (currentPlayerIndex == 0) { 
     currentMediaPlayer = mediaPlayers[1]; 
     preloadMediaPlayer = mediaPlayers[0]; 
     currentPlayerIndex = 1; 
    } else if (currentPlayerIndex == 1) { 
     currentMediaPlayer = mediaPlayers[0]; 
     preloadMediaPlayer = mediaPlayers[1]; 
     currentPlayerIndex = 0; 
    } 
} 

Это упрощенная версия, вы, вероятно, хотите расширить MediaPlayer и добавить несколько флагов, чтобы узнать, готовы ли вы предварительно загрузить (или сделать поджимать, и вы будете готовы) и т.д.

Но это должен дать вам эту идею.

Не забудьте освободить все, когда вы закончите, вызвав сброс/выпуск в медиаплеере.

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