Проигрывание музыкиДля проигрывания медиафайлов в Android используется класс MediaPlayer. Он берет на себя большинство проблем работы с аудио. Итак, для работы аудиоплеера понадобится экземпляр класс MediaPlayer. Лучше всего объявить его как приватное поле.
private MediaPlayer mediaPlayer;
Конструктор лучше всего добавить в onCreate(...):
- Код: выделить все
mediaPlayer = new MediaPlayer();
Для плеера в простейшем случае нужны проигрывание, пауза и остановка проигрывания. Кроме того, необходимо подготовить объект mediaPlayer к использованию. Такую подготовку стоит вынести в отдельный метод.
- Код: выделить все
private boolean prepare() {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(getApplicationContext(), uri);
mediaPlayer.prepare();
} catch (Exception e) {
return false;
}
return true;
}
В этом методе указываются некоторые параметры для проигрывания аудио и происходит подготовка к проигрыванию. Некоторые методы внесены в секцию try, т.к. объект mediaPlayer не всегда может находиться в нужном состоянии, в этом случае метод вернет значение false.
Также рекомендуется создать переменную, которая бы отражала состояние плеера. Лучше всего для этой цели создать отдельный тип.
private enum State { NOT_VALID, PLAYING, STOPPED, PAUSED };
private State state = State.NOT_VALID;
Теперь можно добавить изменение переменной состояния в метод prepare().
- Код: выделить все
private boolean prepare() {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
state = State.NOT_VALID;
try {
mediaPlayer.setDataSource(getApplicationContext(), uri);
mediaPlayer.prepare();
state = State.STOPPED;
} catch (Exception e) {
return false;
}
return true;
}
Теперь аналогично prepare() нужно создать методы play(), stop() и pause().
- Код: выделить все
private boolean play() {
try {
mediaPlayer.start();
state = State.PLAYING;
} catch (IllegalStateException e) {
state = State.NOT_VALID;
return false;
}
return true;
}
private boolean stop() {
try {
mediaPlayer.stop();
state = State.STOPPED;
} catch (IllegalStateException e) {
state = State.NOT_VALID;
return false;
}
return true;
}
private boolean pause() {
try {
mediaPlayer.pause();
state = State.PAUSED;
} catch (IllegalStateException e) {
state = State.NOT_VALID;
return false;
}
return true;
}
Для того чтобы освободить ресурсы, когда проигрывание музыки больше не нужно, необходимо вызвать release(). Так как для каждого подобного действия был написан отдельный метод, то лучше поддержать единый стиль, несмотря на то что метод будет состоять из одной строки.
- Код: выделить все
private void release() {
mediaPlayer.release();
}
Теперь можно поместить вызовы написанных методов в этапы жизненного цикла activity. Первый метод, который вызывается при старте activity – onCreate(...), после него вызывается onStart(). Для каждого из этих методов есть “зеркальные”, которые вызываются при закрытии activity. А именно, сначала вызывается onStop(), а потом onDestroy(). onStop() будет вызван в том случае, если activity уйдет из области видимости и пользователь переключится на другую задачу (при появлении всплывающих диалогов и прочего, перекрывающего activity лишь частично, onStop не вызывается!). Если потом пользователь вернется к activity, для которой был вызван OnStop(), то будет вызван onStart() и activity продолжит работу.
Так как в текущем виде аудиоплеер еще достаточно “сырой”, то имеет смысл выключать проигрывание, когда вызывается onStop(). К примеру, при звонке пользователю совершенно не захочется открывать ваше приложение, чтобы выключить мешающую музыку. Поэтому включение музыки можно сделать в onStart(), а выключение в onStop().
- Код: выделить все
@Override
protected void onStart() {
if (prepare())
play();
super.onStart();
}
@Override
protected void onStop() {
stop();
release();
super.onStop();
}
Также необходимо изменить состояние плеера, когда песня закончит проигрываться. Для этого нужно создать обработчик события OnCompletionListener:
- Код: выделить все
private OnCompletionListener completionListener = new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer listener) {
state = State.STOPPED;
}
};
Теперь нужно “связать” обработчик и объект mediaPlayer, лучше всего это сделать сразу после создания объекта плеера.
- Код: выделить все
mediaPlayer.setOnCompletionListener(completionListener);