Опубликован: 06.05.2014 | Уровень: для всех | Доступ: платный
Самостоятельная работа 6:

Управление воспроизведением аудио

< Лекция 6 || Самостоятельная работа 6: 12 || Лекция 7 >
Аннотация: Пользователи приложения, воспроизводящего аудио, вправе ожидать предсказуемого способа управления воспроизведением.

Цель работы

научиться добавлять в приложения, поддерживающие воспроизведения аудио, возможностей:

  • управления громкостью и воспроизведением звука с помощью соответствующих кнопок устройства;
  • управления аудио фокусом и адекватного реагирования на изменения аудио фокуса, вызванные системой или другими приложениями.

Управление громкостью и воспроизведением

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

Для начала необходимо понять какой аудио поток будет использовать приложение.

Android поддерживает отдельный аудио поток для воспроизведения музыки, входящих звонков, предупреждений, напоминаний, системных звуков. Это сделано, чтобы позволить пользователю управлять громкостью каждого потока независимо.

Большинство из этих потоков связывается с системными событиями, таким образом, если приложение не является заменой будильника, то аудио будет воспроизводиться в потоке STREAM_MUSIC (константа класса AudioManager).

По умолчанию кнопки управления громкостью изменяют громкость активного аудио потока, если в данный момент ничего не воспроизводится, регулируется громкость входящего звонка. Пользователь игрового приложения или аудиопроигрывателя, нажимая на кнопки управления громкостью, скорей всего ожидает изменения громкости игры или музыки, даже если в данный момент в приложении не воспроизводятся ни какие звуки.

Android предоставляет метод setVolumeControlStream() для задания аудио потока, громкость которого будет регулироваться соответствующими кнопками устройства. В метод onCreate() активности, в которой выполняется воспроизведение аудио, необходимо добавить строку:

setVolumeControlStream(AudioManager.STREAM_MUSIC);

На многих устройствах доступны кнопки управления воспроизведением: play, pause, stop, skip и previous. Как только пользователь нажимает на одну из этих кнопок, система рассылает сообщение о действии ACTION_MEDIA_BUTTON. Для обработки таких нажатий в приложении, необходимо в файле манифеста приложения зарегистрировать приемник широковещательных сообщений (BroadcastReceiver) следующим образом:

<receiver android:name=".RemoteControlReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON"/>
</intent-filter>
</receiver>
</example>

В реализации приемника необходимо определять какая кнопка была нажата и вызвала рассылку широковещательных сообщений. Intent-объект содержит эту информацию в ключе EXTRA_KEY_EVENT, а класс KeyEvent содержит набор констант KEYCODE_MEDIA_*, для представления каждой возможной медиа кнопки, например, KEYCODE_MEDIA_PLAY_PAUSE или KEYCODE_MEDIA_NEXT (полный список констант можно найти в описании класса KeyEvent).

Как получить информацию о нажатии медиа кнопки и выполнить соответствующие действия показывает следующий код:

public class RemoteControlReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
KeyEvent event = 
(KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {
// реакция на нажатие кнопки
}
}
}
}

Необходимо программно указывать, когда приложение может получать информацию о событиях нажатия медиа кнопок.

Сначала необходимо создать экземпляр класса AudioManager, который позволит регистрировать и отменять регистрацию приемника событий нажатия медиа кнопок:

AudioManager am = 
mContext.getSystemService(Context.AUDIO_SERVICE);

Далее необходимо зарегистрировать приемник:

//начать прослушивание нажатий кнопок 
am.registerMediaButtonEventReceiver(RemoteControlReceiver);

Зарегистрированный приемник широковещательных сообщений будет единственным приемником всех событий нажатий медиа кнопок, поэтому необходимо отменить регистрацию приемника, как только пропадет неоходимость в нем:

//закончить прослушивание нажатий кнопок 
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);

Обычно приложения отменяют регистрацию большинства своих приемников, когда они становятся неактивными или невидимыми, т.е. при вызове метода onStop(). Для приложения, воспроизводящего аудио, обычно важно получать события нажатия кнопок тогда, когда оно невидимо, поэтому лучше регистрировать и снимать регистрацию приемника событий нажатия медиа кнопок, когда приложение получает или теряет аудио фокус, соответственно.

< Лекция 6 || Самостоятельная работа 6: 12 || Лекция 7 >
Александр Коновалов
Александр Коновалов
Олег Литовка
Олег Литовка
Украина