【问题标题】:Twilio Outbound call - Add more people to existing callTwilio 出站呼叫 - 将更多人添加到现有呼叫
【发布时间】:2020-09-14 18:00:41
【问题描述】:

我正在尝试创建一个 Web 应用程序,其中:

  1. 我通过 twilio 从浏览器应用程序向电话号码发出呼出电话。我将 Twilio Client(js) v 1.10.1 用于浏览器应用程序。 后端 webhook 使用 Twilio 的 Dial and Number 动词用 Java 编写。我能够使用 twilio 的可编程语音来实现它。

    伪代码如下

    前端代码

    let device = require('twilio-client').Device;
    let outboundCall = '';
    const twilioInit = () => {
    // twilio client initialization logic goes here
    
    }
    
    // on phone icon click i am calling the below method
    const makeOutboundCall = () => {
            outboundCall = device.connect({        
                To: TO_NUMBER // The first to number
            });
    }
    

    后端代码 - 服务器端(webhook)

    @RequestMapping(value="/callCustomers", produces= "text/xml")
    public String callByBrowserToMobile(@RequestParam String ApplicationSid, @RequestParam String ApiVersion, 
                                        @RequestParam String Called, @RequestParam String Caller, 
                                        @RequestParam String CallStatus, @RequestParam String To,
                                        @RequestParam String From, @RequestParam String CallSid,
                                        @RequestParam String Direction, @RequestParam String AccountSid) {
    
        Number number = new Number.Builder(To).build();
        Dial dial = new Dial.Builder().answerOnBridge(true).number(number).callerId(myTwilioNumber).build();
        VoiceResponse response = new VoiceResponse.Builder().dial(dial).build();
        logger.info(response.toXml());              
        return response.toXml();    
    }
    
  2. 其次,一旦拨出电话接通,我想将更多人添加到正在进行的通话中。

如何实现第二个要求?

已编辑: 我尝试使用以下代码进行电话会议:

@RequestMapping(value = "/callMobile", produces = "text/xml")
public String callByBrowserToMobile(@RequestParam String ApplicationSid, @RequestParam String ApiVersion,
        @RequestParam String Called, @RequestParam String Caller, @RequestParam String CallStatus,
        @RequestParam String To, @RequestParam String From, @RequestParam String CallSid,
        @RequestParam String Direction, @RequestParam String AccountSid) {

    LOG.info("Call by browser to mobile");
    
    String voiceCallBackUri = new StringBuilder(
            env.getProperty("twilio.exposed.uri").concat("/conferenceCallBack")).toString();
    String joinConferenceUri = new StringBuilder(
            env.getProperty("twilio.exposed.uri").concat("/joinConference")).toString();
    
    String fromNumber = "+xxxxxxxxx35"; // Bought Twilio Number
    Call call = Call.creator(
                new com.twilio.type.PhoneNumber("+"+To),
                new com.twilio.type.PhoneNumber(fromNumber),
                URI.create(joinConferenceUri))
            .setMethod(HttpMethod.GET)
            .setStatusCallback(URI.create(voiceCallBackUri))
            .setStatusCallbackMethod(HttpMethod.POST)
        .create();
    
    
    Conference.Builder conferenceBuilder = new Conference.Builder("My Conference");
    
    Dial dial = new Dial.Builder().conference(conferenceBuilder.build()).build();
    VoiceResponse twiml = new VoiceResponse.Builder().dial(dial).build();       
    
    return twiml.toXml();
}

@RequestMapping("/joinConference")
public String joinConference() {
    
    LOG.info("joinConference");
    
    Conference.Builder conferenceBuilder = new Conference.Builder("My Conference");
    
    Dial dial = new Dial.Builder().conference(conferenceBuilder.build()).build();
    VoiceResponse twiml = new VoiceResponse.Builder().dial(dial).build();       
    
    return twiml.toXml();
}

@RequestMapping("/conferenceCallBack")
public void conferenceCallBack(@RequestParam String Called, @RequestParam String ToState,
        @RequestParam String CallerCountry, @RequestParam String Timestamp, @RequestParam String Direction,
        @RequestParam String CallbackSource, @RequestParam String SipResponseCode, @RequestParam String CallerState,
        @RequestParam String ToZip, @RequestParam String SequenceNumber, @RequestParam String To,
        @RequestParam String CallSid, @RequestParam String ToCountry, @RequestParam String CallerZip,
        @RequestParam String ApiVersion, @RequestParam String CalledZip,@RequestParam String CallStatus,
        @RequestParam String CalledCity, @RequestParam String Duration, @RequestParam String From, 
        @RequestParam String CallDuration, @RequestParam String AccountSid, @RequestParam String CalledCountry, 
        @RequestParam String CallerCity, @RequestParam String Caller, @RequestParam String FromCountry, 
        @RequestParam String ToCity, @RequestParam String FromCity, @RequestParam String CalledState, 
        @RequestParam String FromZip, @RequestParam String FromState) {
    LOG.info("conferenceCallBack");
}

使用上面的代码进行会议,呼叫者(浏览器应用程序)会听到等待电话会议的音乐,并且被呼叫者接听电话,但是当被选中时,只会听到会议名称并且被呼叫者的呼叫断开。请指导查找问题。

【问题讨论】:

    标签: twilio twilio-twiml twilio-conference


    【解决方案1】:

    这里是 Twilio 开发者宣传员。

    您没有将 /joinConference 路由作为 text/xml 提供服务,因此 Twilio 将其读取为 text/plain 并将其视为 <Say>

    我认为您需要将produces = 'text/xml' 添加到RequestMapping,如下所示:

    @RequestMapping("/joinConference", produces = "text/xml")
    

    让我知道这是否有帮助。

    【讨论】:

    • 谢谢@philnash,我会尽力让你知道的。
    【解决方案2】:

    您可以使用代理会议。 这是示例代码和其工作原理的高级图片 https://www.twilio.com/blog/multi-party-calls-voip-gsm-programmable-voice

    【讨论】:

    • 我尝试了上面链接中提到的这种方法。当发出初始呼出呼叫时,浏览器应用程序会收到音乐等待音,并且接收方会收到呼叫。当收件人接听电话时,它只会说出会议名称并退出。请指导。
    • 听起来来电者不在会议中
    • 据我了解,呼叫者(浏览器应用程序)在会议中,而被呼叫者不在会议中,因为对于呼叫者,呼叫会继续以电话会议的默认保持音乐进行,而对于被呼叫者,呼叫会掉线听到会议名称后。我会尽快分享代码。请帮忙。
    • 嗨@A-Developer-Has-No-Name,我已经编辑了问题以添加用于电话会议的代码。
    猜你喜欢
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多