【问题标题】:TAPI 3 Call State event is not firing when device in hands freeTAPI 3 Call State 事件在设备处于免提状态时未触发
【发布时间】:2016-08-26 16:01:45
【问题描述】:

我有一个应用程序来记录通话状态并将通话信息记录到数据库表中。我使用 interop.TAPI3Lib dll 和一个 TAPI3 驱动程序来连接调用信息。

以下是我认为相关的代码部分

我监听 CallState 事件

tapi.EventFilter = (int)(TAPI3Lib.TAPI_EVENT.TE_CALLSTATE);

tapi.ITTAPIEventNotification_Event_Event += new   
    TAPI3Lib.ITTAPIEventNotification_EventEventHandler(tapi_ITTAPIEventNotification_Event_Event);

并注册我要监控的每个设备(地址)

    RegEventsResult[line] = 
    tapi.RegisterCallNotifications(
    address, 
    true, 
    false, 
    TAPI3Lib.TapiConstants.TAPIMEDIATYPE_AUDIO, 2);

然后我记录调用状态变化的结果

private void tapi_ITTAPIEventNotification_Event_Event(TAPI3Lib.TAPI_EVENT TapiEvent, object pEvent)
{
      string callerID, group, extension;
      long origin;
      TAPI3Lib.ITAddress address;

      switch (TapiEvent)
      {
          case TAPI3Lib.TAPI_EVENT.TE_CALLSTATE:

              TAPI3Lib.ITCallStateEvent callStateEvent = (TAPI3Lib.ITCallStateEvent)pEvent;

              TAPI3Lib.ITCallInfo call = callStateEvent.Call;

              extension = call.Address.DialableAddress;

              address = call.Address;

              switch (call.CallState)
              {
                  case TAPI3Lib.CALL_STATE.CS_INPROGRESS:
                            callerID = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER);

                            group = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLEDIDNAME);

                            AddLog("InProgress", callerID, group, extension);
                            break;
                  case TAPI3Lib.CALL_STATE.CS_CONNECTED:
                            callerID = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER);

                            group = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLEDIDNAME);

                            AddLog("Connected", callerID, group, extension);
                            break;
                  case TAPI3Lib.CALL_STATE.CS_OFFERING:
                            callerID = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER);

                            group = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLEDIDNAME);

                            AddLog("Offering", callerID, group, extension);
                            break;
                  case TAPI3Lib.CALL_STATE.CS_DISCONNECTED:
                            AddLog("Disconnected", "", "", extension);
                            resetNotification(extension, address);
                            break;
                  case TAPI3Lib.CALL_STATE.CS_IDLE:
                            AddLog("Idle", "", "", extension);
                            break;
             }
             break;
       }
  }

这很好用——尤其是当我每次断开连接时都重新注册设备。

但是,如果用户在设备上更改为免提 - 以便自动拨打电话,则不会触发通话状态事件。

如果我在通话期间手动重新注册设备,我会收到连接通话状态事件。

任何想法为什么免提设备会对通话状态事件产生任何影响?

【问题讨论】:

  • 我没有详细查看您的代码,但请注意从 .NET 直接与 TAPI 对话。垃圾收集器和自动生成的 COM 互操作层不能很好地配合它,虽然它看起来可以工作,但你确实会时不时地遇到奇怪的问题。周围有 3rd 方库可以将 TAPI 正确地暴露给 .NET,或者您可以采用自己编写 C++/CLI 包装器的方法。祝你好运!

标签: c# telephony tapi


【解决方案1】:

这种“免提”模式不应影响您获得的活动。我建议您使用独立工具来检查其他应用程序是否获得相同的结果。因为您可能在驱动程序或 PBX 中发现了错误。 如果你没有,你可以在这里试试 TAPI 软电话:

http://julmar.com/tapi/

在每次通话后重新注册也是不必要的,实际上可能弊大于利。

【讨论】:

    【解决方案2】:

    我最终使用了TraySoft's AddTapi.Net 库,这似乎工作得非常顺利,易于设置和使用,文档非常好。

    而且我只需要编写很少的代码即可实现与上述相同的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 2014-02-07
      • 2019-08-18
      • 2017-10-04
      • 2020-05-07
      相关资源
      最近更新 更多