2013-11-02 2 views
5

Я играю аудиоклип с использованием OpenSL ES. В моем коде я имеюУправление громкостью звука с принудительным звуком

audioManager.setMode(AudioManager.MODE_IN_CALL); 
    audioManager.setSpeakerphoneOn(true); 

, чтобы заставить звук через динамик во время подключения гарнитуры. Это прекрасно работает, но я не могу контролировать громкость. Нажатие кнопок регулировки громкости во время воспроизведения клипа приводит к появлению и перемещению стрелки тома, но громкость не изменяется. Вызов setVolumeControlStream(AudioManager.STREAM_VOICE_CALL) или setVolumeControlStream(AudioManager.STREAM_MUSIC) перед игрой не помогает. Изменение любого из томов вне моего приложения (например, в настройках Android) не влияет на громкость воспроизведения. Регулятор громкости хорошо работает как на гарнитуре, так и на динамике при отсутствии маршрутизации.

Я также попытался маршрутизации аудио на динамик с помощью этого кода я нашел в другом ответе

Class audioSystemClass = Class.forName("android.media.AudioSystem"); 
    Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class); 
    // First 1 == FOR_MEDIA, second 1 == FORCE_SPEAKER. To go back to the default 
    // behavior, use FORCE_NONE (0). 
    setForceUse.invoke(null, 1, 1); 

но это не работает на моем Android 4.3 Nexus 4. Мне нужно наиболее совместимую путь к к этому все равно.

Любые идеи? Спасибо.

ответ

1

Вот несколько идей:

  1. MODE_IN_CALL устанавливает все виды приоритета/политики на STREAM_VOICE_CALL. В течение этого времени другой STREAM может потерять фокус регулировки громкости. Посмотрите, воспроизводится ли ваш аудиоклип через STREAM_VOICE_CALL.

  2. MODE_IN_COMMUNICATION (для VoIP) может быть лучше подходит для вас. MODE_IN_CALL предназначен для сотового вызова и может ухудшить качество звука.

  3. Возможно, вы захотите попробовать захватить аудиофокус и посмотреть, поможет ли это. http://developer.android.com/training/managing-audio/audio-focus.html

+0

Установка типа потока в 'SL_ANDROID_STREAM_VOICE' в OpenSL игрок сделал трюк, спасибо. Теперь я могу контролировать громкость во время воспроизведения клипа (появляется экран поиска трубки), но я бы хотел установить громкость даже тогда, когда он не воспроизводится. Вызов 'setVolumeControlStream (AudioManager.STREAM_VOICE_CALL)' в методе 'onResume()' Activity, по-видимому, заставляет вас контролировать громкость звонка (отображается стрелка трубки), но когда вы воспроизводите клип, том является последним, который вы установили во время воспроизведения. Я также попробовал 'setStreamVolume (AudioManager.STREAM_VOICE_CALL, vol, 0)', но он просто игнорируется. – Nitrooo

+0

Я только что узнал, что если я опускаю вызов audioManager.setSpeakerphoneOn (true) ', позволяя воспроизведению звука через динамик устройства вместо динамика, уровень громкости, который вы можете установить, когда клип не воспроизводится, соответствует громкости уровень, который вы можете видеть (и слышать) во время игры, и это поведение, которое я бы хотел достичь с помощью динамика. Это означает, что вызов 'setVolumeControlStream (AudioManager.STREAM_VOICE_CALL)' делает кнопки регулировки громкости динамиком. Я хочу, чтобы кнопки регулировки громкости соответствовали уровню громкоговорителей. Есть ли какой-нибудь взлом? – Nitrooo

+0

Рад, что первое решение работает для вас. Теперь, когда ваш звук STREAM_VOICE_CALL соответствует MODE_IN_CALL, регулятор громкости - это немного другая система. Android имеет несколько разных настроек громкости для voice_call, музыки, bluetooth, сигналов тревоги, уведомлений и т. Д. Когда используется аудиовыход из внутреннего объема, используется STREAM_VOICE_CALL. Выход из гарнитуры, объем STREAM_VOICE_CALL используется для MODE_IN_CALL/MODE_IN_COMMUNICATION. В вашем случае динамика вам необходимо контролировать громкость STREAM_MUSIC, даже если вы играете STREAM_VOICE_CALL. Надеемся, что это поможет –

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