Запрос AudioFocus ОТКЛОНЕН в OpenTok (Tokbox), когда в том же добавленном вызове, android 9 и 10 - PullRequest
6 голосов
/ 20 июня 2020

Android Telecom Manager нет входящего звука / звука при добавленном вызове VOIP

Я пытаюсь добавить видеозвонки VOIP в свое приложение. Я зарегистрировал телефонную учетную запись и добавил вызов в TelecomManager. Звонок принят успешно. Я уже реализовал Connection и ConnectionService.

Я использую приведенный ниже код для добавления вызова.

var uri = Android.Net.Uri.FromParts(PhoneAccount.SchemeSip, voipCallInfo.Payload?.CallerName, null);
extras.PutParcelable(TelecomManager.ExtraIncomingCallAddress, uri);
extras.PutParcelable(TelecomManager.ExtraPhoneAccountHandle, phoneAccountHandle);
telecomManager.AddNewIncomingCall(phoneAccountHandle, extras);

, и я использую приведенный ниже код для приема звонка.

var telecomManager = GetTelecomManager();
if (telecomManager == null)
{
     logger.Error("Telecom Manager is null, May be permissions not granted");
     return;
}
try
{
     .
     .
     .
     telecomManager.AcceptRingingCall();
     .
     .
}
catch (Exception ex)
{
     logger.Error("RequestSystemToAnswerCall Exception : " + ex.Message);
}

Я попытался запросить фокус звука, но когда я добавляю вызов в диспетчере связи, мое приложение теряет фокус, потому что телефон начинает звонить. После того, как я принимаю вызов, приложение не получает фокус обратно, я считаю, что Telecom / Call имеет фокус , но я ничего не слышу . Другой собеседник может меня услышать без проблем. Когда я завершаю вызов, приложения возвращают фокус.

Я вижу в журналах ниже.

    2020-06-22,14:09:34.831 WebRTCManager Trace IsAudioSubscriptionEnabled True 
[AudioManager] Use of stream types is deprecated for operations other than volume control
[AudioManager] See the documentation of requestAudioFocus() for what to use instead with android.media.AudioAttributes to qualify your playback use case
[AUDIO_FOCUS] Audio Focus request DENIED !

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

 public bool RequestAudioFocus()
    {
        var amanager = (AudioManager)GetSystemService(AudioService);
        AudioFocusRequest audioFocusRequest;
        if (Build.VERSION.SdkInt > BuildVersionCodes.O)
        {
            audioFocusRequest = amanager.RequestAudioFocus(new AudioFocusRequestClass.Builder(AudioFocus.Gain)
                                       .SetAudioAttributes(new AudioAttributes.Builder().SetLegacyStreamType(Stream.VoiceCall).Build())
                                       .SetOnAudioFocusChangeListener(this)
                                       .Build());
        }
        else
        {
            audioFocusRequest = amanager.RequestAudioFocus(this, Stream.VoiceCall, AudioFocus.Gain);
        }

        Debug.WriteLine("MainActivity RequestAudioFocus audioFocusRequest : " + audioFocusRequest);

        if (audioFocusRequest == AudioFocusRequest.Granted)
        {

            return true;
        }
        return false;
    }

Когда я устанавливаю sh соединение VOIP без использования TelecomManager. Все работает нормально. Поэтому я считаю, что что-то пойдет не так, когда я добавляю и принимаю вызов.

Спасибо за любую идею или исправление.

Ответы [ 2 ]

1 голос
/ 26 июня 2020

Причина, по которой вы ничего не слышите, заключается в том, что OpenTok подчиняется результату RequestAudioFocus. Поскольку запрос фокуса аудио не выполняется, OpenTok не воспроизводит аудио. Вы можете узнать, почему происходит сбой RequestAudioFocus, или загрузить его в Xamarin.OpenTok. Android 2.14.2, чтобы воспроизводить звук даже в случае сбоя RequestAudioFocus.

0 голосов
/ 26 июня 2020

Вы должны использовать AudioManager.AUDIOFOCUS_GAIN или AudioManager.AUDIOFOCUS_GAIN_TRANSIENT для запроса аудиофокуса. Здесь вы собираетесь запросить неопределенное количество времени при получении вызова, поэтому использование AudioManager.AUDIOFOCUS_GAIN_TRANSIENT настоятельно рекомендуется для запроса аудиофокуса. Вот фрагмент кода.

AudioManager mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
AudioAttributes mAudioAttributes =
       new AudioAttributes.Builder()
               .setUsage(AudioAttributes.USAGE_MEDIA)
               .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
               .build();
AudioFocusRequest mAudioFocusRequest =
       new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
               .setAudioAttributes(mAudioAttributes)
               .setAcceptsDelayedFocusGain(true)
               .setOnAudioFocusChangeListener(...) // Need to implement listener
               .build();
int focusRequest = mAudioManager.requestAudioFocus(mAudioFocusRequest);
switch (focusRequest) {
   case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
       // don’t start playback
   case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
       // actually start playback
}

Установив функцию обратного вызова слушателя в setOnAudioFocusChangeListener, вы можете прослушивать изменение фокуса звука.

На Android N и ранее вы можете объявить это намерение без использования объекта AudioFocusRequest, как показано ниже во фрагменте. Вам все равно нужно реализовать AudioManager.OnAudioFocusChangeListener, чтобы отреагировать на изменение статуса. Вот код, эквивалентный приведенному выше фрагменту.

AudioManager mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
int focusRequest = mAudioManager.requestAudioFocus(
..., // Need to implement listener
       AudioManager.STREAM_MUSIC,
       AudioManager.AUDIOFOCUS_GAIN);
switch (focusRequest) {
   case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
       // don't start
   case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
       // start
}

В заключение, когда ваше приложение завершило воспроизведение звука, оно должно отказаться от фокуса звука, вызвав AudioManager.abandonAudioFocus(…).

Для вашего данного кода, если OpenTok не обрабатывает звуковой фокус, вы должны запросить звуковой фокус до вызова метода AcceptRingingCall(). Вы можете подписаться на официальные android документы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...