Java 我们能在Twilio的电话会议中拨一个号码吗?

Java 我们能在Twilio的电话会议中拨一个号码吗?,java,twilio,conference,Java,Twilio,Conference,我是这个领域的新手。有问题了。我想在电话会议期间拨打一个号码,并将该与会者添加到当前会议中。 我尝试了Java中给出的会议示例代码。有没有办法收集信息,然后拨打电话号码,将参与者加入同一个会议 这是我试过的。我已经创建了一个会议,它将返回以下响应 <Response> <Dial hangupOnStar="true"> <Conference startConferenceOnEnter="true" endConferenceOnExit="true">M

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

这是我试过的。我已经创建了一个会议,它将返回以下响应

<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>
在statusCallback上,我正在更新呼叫以重定向到主叫方和被叫方的会议,其中主叫方是通过按
*
离开会议的人,即A,被叫方是某个有效的电话号码。代码如下所示

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();
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应该能够拨打其他号码并将其添加到同一会议中。我正在用手机连接号码

提前感谢。

这里是Twilio员工

你可以!您可以做的是使用REST API进行出站调用,并让该调用返回带有会议动词和相同会议名称的TwiML-例如,如果您创建了一个名为
conference1
的会议调用,您将希望使用TwiML进行响应,该TwiML类似于:

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

会议1
将出站呼叫连接到现有会议或创建会议

如果您在现有通话中使用
动词进行输入,那么您也可以使用此解决方案。您希望重定向调用流,而不是创建一个全新的调用,因此只需在聚集回调中返回这个TwiML

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

Twilio员工在此

你可以!您可以做的是使用REST API进行出站调用,并让该调用返回带有会议动词和相同会议名称的TwiML-例如,如果您创建了一个名为
conference1
的会议调用,您将希望使用TwiML进行响应,该TwiML类似于:

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

会议1
将出站呼叫连接到现有会议或创建会议

如果您在现有通话中使用
动词进行输入,那么您也可以使用此解决方案。您希望重定向调用流,而不是创建一个全新的调用,因此只需在聚集回调中返回这个TwiML


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

Twilio开发者福音传道者

您遇到的问题是,您正试图在TwiML中执行两次拨号以响应。您应该使用TwiML将电话中的人引导回原始会议,而不是将a与您用
拨打的电话号码进行配对

要将其转化为明确的步骤,应该是这样的:

@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();
        }
    }
}
  • 用户拨打Twilio号码
  • TwiML响应,使用hangUpOnStar将用户添加到会议中
  • 用户按下star键并收集请求拨打的号码
  • 在对来自Gather的号码的响应中,使用RESTAPI创建调用,并将该调用定向到原始入站URL(“/conference”)
  • 在对聚集操作的响应中,返回TwiML以将原始调用者返回到会议(重定向到原始入站URL)
  • 我不是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();
            }
        }
    }
    
    您现在不需要状态回调


    让我知道这是否有帮助

    这里的Twilio开发者福音传道者

    您遇到的问题是,您正试图在TwiML中执行两次拨号以响应。您应该使用TwiML将电话中的人引导回原始会议,而不是将a与您用
    拨打的电话号码进行配对

    要将其转化为明确的步骤,应该是这样的:

    @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();
            }
        }
    }
    
  • 用户拨打Twilio号码
  • TwiML响应,使用hangUpOnStar将用户添加到会议中
  • 用户按下star键并收集请求拨打的号码
  • 在对来自Gather的号码的响应中,使用RESTAPI创建调用,并将该调用定向到原始入站URL(“/conference”)
  • 在对聚集操作的响应中,返回TwiML以将原始调用者返回到会议(重定向到原始入站URL)
  • 我不是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();
            }
        }
    }
    
    您现在不需要状态回调


    如果有帮助,请告诉我

    谢谢你,菲尔。我可以为会议添加一名参与者。:)谢谢你,菲尔。我可以为会议添加一名参与者。:)谢谢你,瑞奇,谢谢你的回复。真的很感谢你的努力。嘿,瑞奇,你能帮忙吗?谢谢你,瑞奇,谢谢你的回复。非常感谢你的努力。嘿,瑞奇,你能帮我一下吗