Запрос AudioFocus ОТКЛОНЕН для OpenTok (Tokbox), когда в том же добавленном Call, android 9 и 10

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;
    }

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

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


person Basit ZIa    schedule 20.06.2020    source источник
comment
Привет, Малик, я не вижу кода, в котором вы действительно запрашиваете фокусировку звука. Обычно вы создаете AudioFocusRequest, и в вашем случае это будет уместно для голосовой связи AudioAttribute с запросом. Я немного просмотрел код opentok и не вижу нигде, где вам нужен Audio Focus. Так что вам, вероятно, придется запросить это самостоятельно, прежде чем добавлять вызов. Вы также можете использовать это, чтобы определить, действительно ли ваше приложение теряет фокус звука, хотя фокус звука изменяется в слушателе.   -  person Cheesebaron    schedule 25.06.2020
comment
Привет, @Cheesebaron. Спасибо, что изучили это. Я добавил код, который использую для запроса аудиофокуса. Приложение теряет фокус, когда я добавляю вызов в telecomManager, как только я завершаю вызов, приложение снова получает фокус.   -  person Basit ZIa    schedule 26.06.2020
comment
@BasitZIa, можно мне узнать версию Android?   -  person Kiran Maniya    schedule 26.06.2020


Ответы (3)


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

person thorsen    schedule 26.06.2020
comment
Интересно, а почему именно 2.14.2? Буду признателен за любые подробности по этому поводу. - person Alex Sorokoletov; 30.06.2020
comment
@AlexSorokoletov Наверное, потому что они по-разному запрашивают аудиофокус. ИЛИ они продолжают воспроизведение звука, даже если AudioFocusRequest отклонен. В более поздних версиях, я думаю, они приостанавливают / останавливают звук. Я могу только догадываться, пока мы не получим известие от ребят из OpenTok. Я потрачу некоторое время на поиск конкретной / точной причины, когда закончу с выпуском. - person Basit ZIa; 02.07.2020
comment
Спасибо @BasitZIa. 2.14.2 - довольно старая версия, поэтому я был удивлен этим советом (не просто откат к предыдущей версии, но и к этой конкретной). - person Alex Sorokoletov; 03.07.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.

person Kiran Maniya    schedule 25.06.2020
comment
Я думаю, они пытаются справиться с аудиофокусом, и если запрос аудиофокуса отклонен, они не воспроизводят аудио. Переход на 2.14.2 пока работает. - person Basit ZIa; 26.06.2020
comment
Вот что я сказал, см. Первый переключатель фрагмента (focusRequest) {case AudioManager.AUDIOFOCUS_REQUEST_FAILED: // не начинать воспроизведение case AudioManager.AUDIOFOCUS_REQUEST_GRANTED: // фактически запускать воспроизведение} - person Kiran Maniya; 26.06.2020

У меня точно такая же проблема. Вот исправление, которое, вероятно, не является «правильным» способом, но работает для меня. В своей деятельности по вызову VOIP после установления соединения VOIP я убиваю свой объект Connection с помощью:

mCallConnection.onDisconnect();
mCallConnection.destroy();

И OpenTok снова получает звуковой фокус. Входящий звук работает. Я еще не знаю потенциальных последствий преждевременного отключения объекта Connection (не могу выполнять другие функции вызова, такие как удержание, взаимодействие с другими входящими вызовами и т. Д.). Но пока я не найду другой способ для Connection отказаться от своей аудиофокусировки, мне придется это делать.

person Scott Joing    schedule 17.09.2020
comment
Да, это последствия. Еще один звонок на номер службы экстренной помощи. Я не знаю, как система будет вести себя, если пользователь начнет звонить на номер службы экстренной помощи. Для нас эти ситуации были важны, поэтому мы все еще используем старую версию SDK. Я попытался перейти на более новую версию, но у нас возникло больше проблем. - person Basit ZIa; 17.09.2020