невозможно установить связь при использовании callkeep и agora в flutter

# #flutter #firebase-cloud-messaging #phone-call #agora.io

Вопрос:

Я реализовал voip-вызов в своем приложении flutter. Если оба пользователя открывают приложение и присоединяются (канал agora) вручную, все работает нормально. Но, если пользователь A звонит пользователю B, я получаю вызов на мобильный телефон пользователя B с помощью сообщения callkeep и данных fcm. т. Е. в сообщении FCM onBackground я написал код для включения звука и присоединения к каналу. Обе строки выполнены (канал подключен, аудио включено). Но ни один из пользователей не может говорить или слушать других пользователей.

Вот мой код.

 Future<void> bgMsgHandler(RemoteMessage message) async {
 
  Map msgData = message.data;

  if (msgData['action'] == "Incoming call") {
    final callUUID = "call_uuid_1";

    // #region answer_call_action
    _callKeep.on(CallKeepPerformAnswerCallAction(), (event) async {
      print(
          'backgroundMessage: CallKeepPerformAnswerCallAction ${event.callUUID}');
      Timer(const Duration(seconds: 1), () {
        _callKeep.setCurrentCallActive(callUUID);
        _callKeep.setMutedCall(callUUID, true);
      });
      await initAgora();
    });
    // #endregion

    // #region end_call_action
    _callKeep.on(CallKeepPerformEndCallAction(),
        (CallKeepPerformEndCallAction event) {
      print(
          'backgroundMessage: CallKeepPerformEndCallAction ${event.callUUID}');
      engine.leaveChannel();
    });
    // #endregion

    if (!callKeepInited) {
      _callKeep.setup(
          null,
          <String, dynamic>{
            'ios': {
              'appName': 'CallKeepDemo',
            },
            'android': {
              'alertTitle': 'Phone Permissions required',
              'alertDescription': 'Allow access to speak to our partners',
              'cancelButton': 'Cancel',
              'okButton': 'Ok',
              'foregroundService': {
                'channelId': 'com.company.my',
                'channelName': 'Foreground service for my app',
                'notificationTitle': 'My app is running on background',
                'notificationIcon':
                    'Path to the resource icon of the notification',
              },
            },
          },
          backgroundMode: true);
      callKeepInited = true;
    }
    print('backgroundMessage: displayIncomingCall (user B)');
    _callKeep.displayIncomingCall(callUUID, 'user_B');
    _callKeep.backToForeground();
  }
}
 

В консоли отладки я получаю сообщение, к которому присоединились локальные и удаленные пользователи. Но не удается передать и получить аудио.

Вот моя функция инициализации agora

 Future<void> initAgora() async {
  engine = await RtcEngine.create(AGORA_APP_ID);

  engine.setEventHandler(RtcEngineEventHandler(
    joinChannelSuccess: (channel, uid, elapsed) {
      print("local user [$uid] joined");
    },
    userJoined: (uid, elapsed) {
      print("remote user [$uid] joined");
      remoteUid = uid;
    },
    userOffline: (uid, reason) {
      print("remote user [$uid] left channel $reason");
      remoteUid = null;
      engine.leaveChannel();
    },
  ));

  try {
    await engine.enableAudio();
    await engine.joinChannel(AGORA_TOKEN, "firstChannel", null, 0);
  } catch (e) {
    print("error with agora = $e");
  }
}
 

Я не знаю, проблема ли это с agora или callKeep.
Можете ли вы помочь мне решить эту проблему? Любая помощь приветствуется.

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

1. Привет, было бы здорово, если бы вы могли обмениваться журналами для того же. Вы также можете связаться с командой Agora на канале разработчиков Agora slack : agoraiodev.slack.com

Ответ №1:

Я раньше не использовал Agora, но я не думаю, что muted должно быть true. _callKeep.setMutedCall(callUUID, true);

Ответ №2:

Из вашего кода похоже, что он предназначен для того, чтобы каждый пользователь не мог говорить или слышать друг друга.

В блоке

 Timer(const Duration(seconds: 1), () {
        _callKeep.setCurrentCallActive(callUUID);
        _callKeep.setMutedCall(callUUID, true);
      });
 

Изменить

 _callKeep.setMutedCall(callUUID, true);
 

Для

 _callKeep.setMutedCall(callUUID, false);
 

Или удалите его полностью.