我们可以在Twilio的电话会议中拨打电话吗?

时间:2017-11-17 13:54:12

标签: java twilio conference

我是这个领域的新手。质疑。我想在电话会议期间拨打电话,并将该与会者添加到当前会议中。 我在 Java 中给出了here的会议示例代码。有没有办法收集输入然后拨打号码并将参与者添加到同一个会议。

这是我尝试过的。我创建了一个会议,并将返回以下回复

<Response>
<Dial hangupOnStar="true">
<Conference startConferenceOnEnter="true" endConferenceOnExit="true">My Conference</Conference>
</Dial>
<Gather timeout="10" action="/twilio-tut/add/participant?confName=My%20Conference" finishOnKey="#">
<Say>Please enter the number you want to connect followed by hash key.</Say></Gather>
</Response>

现在,会议的参与者之一说 A *并拨打了他想要加入会议的其他人。

现在在Gather动词的操作中,我拨打的代码如下所示

Number number = 
                    new Number.Builder(some_valid_phone_number)
                    .statusCallback("https://xxxxxxx.ngrok.io/twilio-tut/to/conference")
                    .statusCallbackMethod(Method.POST)
                    .statusCallbackEvents(Arrays.asList(Event.ANSWERED))
                    .build();

            Dial dial = new Dial.Builder()
                    .number(number)
                    .conference(new Conference.Builder(conferenceName).build())
                    .build();

            twiml = new VoiceResponse.Builder().dial(dial)
                    .build();

在statusCallback上,我正在更新呼叫以重定向到呼叫者和被呼叫者的会议,其中呼叫者是通过按*离开会议的人,即 A 且被呼叫者 some_valid_phone_number 即可。代码如下所示

Call callee = Call.updater(callSid)
                    .setUrl("https://xxxxx.ngrok.io/twilio-tut/voice").setMethod(HttpMethod.POST).update();
            Call caller = Call.updater(parentCallSid)
                    .setUrl("https://xxxxx.ngrok.io/twilio-tut/voice").setMethod(HttpMethod.POST).update();

上面的代码传输被调用者并断开调用者与异常

com.twilio.exception.ApiException: Call is not in-progress. Cannot redirect.

我想要做的是 A 拨打其他号码,最后他们将连接到同一个会议。并且 A 应该能够呼叫其他号码并将其添加到同一会议中。我用手机连接数字。

提前致谢。

2 个答案:

答案 0 :(得分:2)

Twilio员工在这里。

你可以!您可以做的是使用REST API进行出站呼叫,并使该呼叫返回带有会议动词的TwiML和相同的会议名称 - 例如,如果您已创建名为conference1的电话会议,则#39;我想用TwiML回复看起来像:

<Response>
    <Dial>
        <Conference>conference1</Conference>
    </Dial>
</Response>

这会将出站呼叫连接到现有会议,或创建它。

如果您在现有通话中使用<Gather>动词输入,那么您也可以使用此解决方案。您想重定向调用流,而不是创建一个全新的调用,所以只需在Gather回调中返回此TwiML。

如果您已跟踪会议SID,您还可以通过创建出站电话会议(sample code here)以编程方式添加它们。与TwiML类似,如果电话会议不存在,Twilio将创建它;如果确实存在,Twilio会将此人添加到其中。

答案 1 :(得分:2)

Twilio开发者传道者在这里。

您遇到的问题是您正在尝试在响应<Gather>的TwiML中执行两次拨号。您应使用<Gather>而不是使用<Dial> <Number>拨打号码create that call using the REST API,而应使用TwiML将手机上的人引导回原创会议。

要把它放到明确的步骤中,它应该是这样的:

  1. 用户拨打Twilio号码
  2. TwiML响应,将用户添加到hangUpOnStar会议
  3. 用户按下星标并收集要求拨打的号码
  4. 在对来自Gather的号码的响应中,使用REST API创建呼叫并将该呼叫定向到原始入站URL(“/ conference”)
  5. 在对Gather操作的响应中,返回TwiML以将原始呼叫者返回会议(重定向到原始入站URL)
  6. 我不是Java开发人员,所以这可能是错的,但你想要的东西看起来有点像这样:

    @WebServlet("/dial/participant")
    public class AddParticipantToConference extends HttpServlet {
    
        public static final String MODERATOR = System.getenv("MY_PHONE_NUMBER");
        public static final String ACCOUNT_SID = System.getenv("TWILIO_ACCOUNT_SID");
        public static final String AUTH_TOKEN = System.getenv("TWILIO_AUTH_TOKEN");
    
        @Override
        protected void doPost(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
                throws IOException {    
            String selectedOption = servletRequest.getParameter("Digits");
    
            VoiceResponse twiml;
    
            if(selectedOption != null){
                Call call = Call.creator(new PhoneNumber("+" + selectedOption), new PhoneNumber(MODERATOR),
            new URI("https://example.com/conference")).create();
            }
    
            twiml = new VoiceResponse.Builder().redirect("/conference").build();
    
            servletResponse.setContentType("text/xml");
    
            try {
                servletResponse.getWriter().print(twiml.toXml());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    您现在不需要statusCallback。

    让我知道这是否有帮助