我正在尝试将'hold call'功能实现到我的系统中 . 我查看了this question和一些twilio文档,推荐的方法是将呼叫出列,这将自动播放保持音乐,然后在保持完成时从队列中检索(取消保持) .
当我有一个来自手机的来电,我的twilio客户端,并且我可以将呼叫出列,这一切都很好 .
然而,当我从twilio客户端到移动设备的拨出呼叫时,如果我更新呼叫以发出出列指令,我会听到客户端本身的保持音乐,并且电话断开连接 . 我想这是因为我已将呼叫的客户端设置为暂停 . 所以问题是如何获得呼叫移动支路的呼叫sid .
我试过通过ParentCallId查询CallResource,但是在传出调用的情况下它不会返回任何内容 . 有任何想法吗?
通过以下方式在客户端上启动呼叫:
var params = {
To: num
};
console.log('Calling ' + num + '...');
Twilio.Device.connect(params);
connect API回调使用简单的Dial动词 .
用于在connect上保存callid的客户端代码:
Twilio.Device.connect(function (conn) {
if (conn._direction === 'OUTGOING') {
$scope.outgoing_call_sid = conn.parameters.CallSid;
$scope.number = conn.message.To;
} else {
$scope.incoming_call_sid = conn.parameters.CallSid;
$scope.number = conn.parameters.From;
}
$scope.message = 'In call with ' + $scope.number;
$scope.status = 'InCall';
});
客户端代码保持按钮单击:
$scope.hold = function () {
$scope.status = 'Hold';
$scope.message = 'Putting on hold...';
if ($scope.outgoing_call_sid) {
return $http.get(serviceBase + 'api/twilio/hold?callid=' + $scope.outgoing_call_sid);
}
};
服务器端Hold API调用:
public IHttpActionResult Hold(string callid) { /
//callid = GetLegCallId(callid); //Try to replace with child call
CallResource.Update(new UpdateCallOptions(callid) { Url = ConfigurationManager.AppSettings["ngrokUrl"] + "/api/twilio/enqueue", Method = HttpMethod.Get });
return Ok();
}
接听任何儿童电话的代码:
public string GetLegCallId(string callId)
{
var calls = CallResource.Read(new ReadCallOptions() { ParentCallSid = callId });
if (calls.GetEnumerator().Current != null)
return calls.GetEnumerator().Current.Sid;
}
1 回答
我的错 . Twilio不是问题 . 问题是使用calls.GetEnumerator() . Current!= null .
在Current将有一个值之前,应该在Enumerator上执行MoveNext . 通过这样做解决 . 笨:(