当设备处于免提状态时,TAPI 3 呼叫状态事件不会触发
TAPI 3 Call State event is not firing when device in hands free
我有一个应用程序可以将呼叫状态和呼叫信息记录到数据库中 table。我使用 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;
}
}
这很好用 - 特别是当我每次断开连接时都重新注册设备。
但是,如果用户在设备上更改为免提 - 以便自动接通呼叫,则不会触发呼叫状态事件。
如果我在该通话期间手动重新注册设备,我会收到已连接通话状态事件。
为什么免提设备会对通话状态事件产生任何影响?
这个"Hands free"模式应该不会影响你得到的事件。我建议您使用独立的工具来检查其他应用程序是否获得相同的结果。因为您可能在您的驱动程序或 PBX 中发现了错误。
如果您没有,可以在此处试用 TAPI 软件 phone:
也没有必要在每次通话后重新注册,实际上可能弊大于利。
我最终使用了 TraySoft's AddTapi.Net 库,这似乎工作起来非常顺利,易于设置和使用,而且文档非常好。
而且我只需要写很少的代码就可以实现与上面相同的功能。
我有一个应用程序可以将呼叫状态和呼叫信息记录到数据库中 table。我使用 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;
}
}
这很好用 - 特别是当我每次断开连接时都重新注册设备。
但是,如果用户在设备上更改为免提 - 以便自动接通呼叫,则不会触发呼叫状态事件。
如果我在该通话期间手动重新注册设备,我会收到已连接通话状态事件。
为什么免提设备会对通话状态事件产生任何影响?
这个"Hands free"模式应该不会影响你得到的事件。我建议您使用独立的工具来检查其他应用程序是否获得相同的结果。因为您可能在您的驱动程序或 PBX 中发现了错误。 如果您没有,可以在此处试用 TAPI 软件 phone:
也没有必要在每次通话后重新注册,实际上可能弊大于利。
我最终使用了 TraySoft's AddTapi.Net 库,这似乎工作起来非常顺利,易于设置和使用,而且文档非常好。
而且我只需要写很少的代码就可以实现与上面相同的功能。