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

Хороший пользовательский опыт это предсказуемый опыт. Если ваше приложение играет медиа файлы, важно, чтобы ваши пользователи могли регулировать громкость вашего приложения с помощью аппаратного или программного регулятора громкости своих устройств, Bluetooth-гарнитуры, или наушников.

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

Определите, какой аудио поток использовать

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

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

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

Использование аппаратных клавиш для регулировки громкости воспроизведения вашего приложения

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

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

Вы можете захотеть прослушивать нажатия кливишь громкости и изменять громкость аудио потока. Не поддавайтесь желанию. Android обеспечивает удобный setVolumeControlStream() метод перенаправления нажатий клавиш громкости в аудио-поток, который вы укажете.

Определив аудиопоток, который ваше приложение будет использовать, вы должны установить его в качестве целевого потока для регилировки громкости. Вы должны выполнить этот вызов в начале жизненного цикла вашего приложения — потому вам нужно вызвать его всего лишь один раз за время жизненного цикла деятельности, вы должны, как правило, вызвать его в onCreate() методе ( Activity или Fragment , который контролирует ваши медиа потоки). Это гарантирует, что всякий раз, когда ваше приложение видно, регуляторы громкости будут функционировать как ожидает пользователь.

setVolumeControlStream(AudioManager.STREAM_MUSIC);

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

Использование аппаратных клавиш для управления воспроизведением аудио вашего приложения

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

Чтобы отвечать на нажатия медиа кнопок, вам необходимо зарегистрировать BroadcastReceiver в вашем манифесте, который будет прослушивает события для этого действия, как показано ниже.

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

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

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

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()) {
                // Handle key press.
            }
        }
    }
}

Т.к. нескольким приложениям может потребоваться прослушивание нажатия медиа кнопок, необходимо также программно управлять тем, когда ваше приложение должно получать нажатия медиа кнопок, а когда не должно.

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

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

// Start listening for button presses
am.registerMediaButtonEventReceiver(RemoteControlReceiver);
...

// Stop listening for button presses
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);

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

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