#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
.