来电直接进入 CallStateEnum.Progress 从 CallStateEnum.Initiation

问题描述 投票:0回答:0

我使用

flutter_webrtc
包来处理 VOIP 电话。我从他们的 GitHub 上运行示例项目,在我将逻辑与 UI 分离之前,它运行良好。现在我正面临这个问题,

来电一开始预计是

CallStateEnum.INITIATION
模式,这是我遇到的行为,但之后很可能会进入
CallStateEnum.CONNECTING
状态,而是直接进入
CallStateEnum.PROGRESS
状态。

这是我从

SipUaHelperListener
覆盖的功能。

  @override
  void callStateChanged(sip.Call newCall, sip.CallState state) {
    call = newCall;

    if (state.state == sip.CallStateEnum.CALL_INITIATION) {

      Navigator.pushNamed(context, '/callscreen');
      startTimer();
      initRenderers();
      update();
    } else {

      if (state.state == sip.CallStateEnum.HOLD ||
          state.state == sip.CallStateEnum.UNHOLD) {
        hold.value = state.state == sip.CallStateEnum.HOLD;
        holdOriginator = state.originator;
        return;
      }

      if (state.state == sip.CallStateEnum.MUTED) {
        if (state.audio!) audioMuted.value = true;
        if (state.video!) videoMuted.value = true;
        return;
      }

      if (state.state == sip.CallStateEnum.UNMUTED) {
        if (state.audio!) audioMuted.value = false;
        if (state.video!) videoMuted.value = false;

        return;
      }

      if (state.state != sip.CallStateEnum.STREAM) {
        callState = state.state;
      }

      switch (state.state) {
        case sip.CallStateEnum.STREAM:
          handelStreams(state);
          break;
        case sip.CallStateEnum.ENDED:
        case sip.CallStateEnum.FAILED:
          backToDialPad();
          break;
        case sip.CallStateEnum.UNMUTED:
        case sip.CallStateEnum.MUTED:
        case sip.CallStateEnum.CONNECTING:
        case sip.CallStateEnum.PROGRESS:
        case sip.CallStateEnum.ACCEPTED:
        case sip.CallStateEnum.CONFIRMED:
        case sip.CallStateEnum.HOLD:
        case sip.CallStateEnum.UNHOLD:
        case sip.CallStateEnum.NONE:
        case sip.CallStateEnum.CALL_INITIATION:
        case sip.CallStateEnum.REFER:
          break;
      }
      update();
    }
  }

此功能分别在两个屏幕(Dialpad 和 CallScreen)上使用,实现了

SIPHelperListner
。我已经通过这个条件分离了逻辑。

if (state.state == sip.CallStateEnum.CALL_INITIATION) {

// User is currently on Dialpad
// Push the Call Screen

}else {

// User is on CallScreen
// Handle call state changes.

}
flutter dart sip voip flutter-webrtc
© www.soinside.com 2019 - 2024. All rights reserved.