Работа с оборудованием аудиовыхода

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

Проверьте какое оборудование используется

Как ваше приложение должно себя вести зависит от того, на какой аппаратный выход в настоящее время направляется звук.

Вы можете запросить AudioManager для определения, направляется ли аудио в настоящее время на громкоговоритель устройства, проводную гарнитуру или подключенное устройство Bluetooth, как показано в следующем фрагменте:

if (isBluetoothA2dpOn()) {
    // Adjust output for Bluetooth.
} else if (isSpeakerphoneOn()) {
    // Adjust output for Speakerphone.
} else if (isWiredHeadsetOn()) {
    // Adjust output for headsets
} else { 
    // If audio plays and noone can hear it, is it still playing?
}

Обработка изменений оборудования аудиовыхода

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

К счастью, система рассылает ACTION_AUDIO_BECOMING_NOISY намерение, когда это происходит. Это хорошая практика, зарегистрировать BroadcastReceiver , который слушает это намерение, когда вы проигрываете аудио. В случае музыкального плеера, пользователи обычно ожидают, что воспроизведение будет приостановлено — а для игр вы можете выбрать значительное уменьшение громкости.

private class NoisyAudioStreamReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
            // Pause the playback
        }
    }
}

private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);

private void startPlayback() {
    registerReceiver(myNoisyAudioStreamReceiver(), intentFilter);
}

private void stopPlayback() {
    unregisterReceiver(myNoisyAudioStreamReceiver);
}