Как изменить громкость вызова с помощью AudioManager.STREAM_VOICE_CALL

#android #android-audiomanager

#Android #android-audiomanager

Вопрос:

У меня есть приложение для звонков. Я создаю дорожку и воспроизводю звук.

 AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, sampleRateInHz, AudioFormat.CHANNEL_CONFIGURATION_MONO, audioFormat, minBufferSize, AudioTrack.MODE_STREAM);
  

Но когда я нажимаю кнопки регулировки громкости, изменяется громкость «мультимедиа», а не «вызова».

Могу ли я заставить кнопки регулировки громкости управлять громкостью «вызова»?

Я нашел способ изменить громкость «вызова», но мне нужно сделать это с помощью кнопок регулировки громкости на устройстве.

 audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, 10, AudioManager.FLAG_SHOW_UI);
  

Ответ №1:

Я использую Audio Manager setMode в IN_CALL, и он отлично работает для моего VoIP-приложения.

 audioManager.setMode(AudioManager.MODE_IN_CALL);


 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        Log.d(THIS_FILE, "Key down : "   keyCode);
 switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_DOWN:
            case KeyEvent.KEYCODE_VOLUME_UP:

                // Volume has been adjusted by the user.

                Log.d(THIS_FILE, "onKeyDown: Volume button pressed");
                int action = AudioManager.ADJUST_RAISE;
                if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
                    action = AudioManager.ADJUST_LOWER;
                }

                // Detect if ringing
                SipCallSession currentCallInfo = getActiveCallInfo();
                // If not any active call active
                if (currentCallInfo == null amp;amp; serviceConnected) {
                    break;
                }

                if (service != null) {
                    try {
                        service.adjustVolume(currentCallInfo, action, AudioManager.FLAG_SHOW_UI);
                    } catch (RemoteException e) {
                        Log.e(THIS_FILE, "Can't adjust volume", e);
                    }
                }
                return true;
}
  

Комментарии:

1. Я пытаюсь: AudioManager.setMode (AudioManager. MODE_IN_CALL), но когда я нажимаю кнопку audio, у меня появляется громкость мультимедиа.

2. вы должны перенести свой аудиоменеджер в службу вызовов.Отрегулируйте объем (currentCallInfo, action, AudioManager. ФЛАГ_SHOW_UI);

Ответ №2:

Это решило мою проблему. Но это уловка. Поблагодарите Маюра Панчала за идею.

 public boolean onKeyUp(int keyCode, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_DOWN:
        case KeyEvent.KEYCODE_VOLUME_UP:
            return true;
    }
    return super.onKeyUp(keyCode, event);
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
     switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_DOWN:
        case KeyEvent.KEYCODE_VOLUME_UP:
            AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            audioManager.adjustStreamVolume(streamType, (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) ? -1 : 1, AudioManager.FLAG_SHOW_UI);
            return true;
    }
    return super.onKeyDown(keyCode, event);
}
  

Я пытался использовать audioManager.setMode(AudioManager.MODE_IN_CALL) , но это работало не на всех моих телефонах.

Ответ №3:

Я использую это в своем приложении baresip voip:

 
   override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        when (keyCode) {
            KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_VOLUME_UP -> {
                am.adjustStreamVolume(volumeControlStream,
                        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)
                            AudioManager.ADJUST_LOWER else
                            AudioManager.ADJUST_RAISE,
                        AudioManager.FLAG_SHOW_UI)
                return true
            }
        }
        return super.onKeyDown(keyCode, event)
    }
  

Когда поступает вызов, я устанавливаю

 volumeControlStream = AudioManager.STREAM_RING
  

и когда вызов установлен, я должен установить

 volumeControlStream = AudioManager.STREAM_MUSIC
  

потому что по какой-то причине установка на AudioManager.STREAM_VOICE_CALL не работает, даже когда режим AudioManager.MODE_IN_COMMUNICATION .