Twilio 接收入站呼叫时出错

Twilio 接收入站呼叫时出错,twilio,Twilio,当使用twilio接收到对我的浏览器的入站呼叫时,第一个初始呼叫起作用,但如果我尝试再次对我的浏览器进行入站呼叫,则会出现twilio错误“创建应答时出错:无法设置本地应答sdp:在错误状态下呼叫:状态\正在进行” 这里是Twilio的Megan 下面的代码改变了我们处理事件侦听器的方式,它适用于接收到相同错误的人,并描述了无法接听后续呼叫的类似行为 <?php include '../Twilio/Services/Twilio/Capability.php'; // put your

当使用twilio接收到对我的浏览器的入站呼叫时,第一个初始呼叫起作用,但如果我尝试再次对我的浏览器进行入站呼叫,则会出现twilio错误“创建应答时出错:无法设置本地应答sdp:在错误状态下呼叫:状态\正在进行”


这里是Twilio的Megan

下面的代码改变了我们处理事件侦听器的方式,它适用于接收到相同错误的人,并描述了无法接听后续呼叫的类似行为

<?php
include '../Twilio/Services/Twilio/Capability.php';

// put your Twilio API credentials here
$accountSid = 'ACxxxxx';
$authToken  = 'aaxxxxx';

// put your Twilio Application Sid here
$appSid     = 'APxxxxx';

$capability = new Services_Twilio_Capability($accountSid, $authToken);
$capability->allowClientOutgoing($appSid);
$capability->allowClientIncoming('alex');
$token = $capability->generateToken();
// put your Twilio Application Sid here
$appSid     = 'APxxxxx';

?>

<!DOCTYPE html>
<html>
<head>
    <title>Twilio Client</title>
    <script type="text/javascript" src="//static.twilio.com/libs/twiliojs/refs/6359b40/twilio.js"></script>
    <script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
    <script type="text/javascript">
    $( document ).ready(function() {
        $("#answer").hide();
        $("#hangup").hide();
        $("#reject").hide();

        Twilio.Device.setup("<?php echo $token; ?>", { debug: true});


        Twilio.Device.ready(function (device) {
            $("#log").text("Ready");
        });

        Twilio.Device.error(function (error) {
            $("#log").text("Error: " + error.message);
        });

        Twilio.Device.connect(function (conn) {
            $("#log").text("Successfully established call");
            $("#call").hide();
            $("#reject").hide();
            $("#hangup").show();

        });

        Twilio.Device.disconnect(function (conn) {
            $("#log").text("Call ended. Ready for new incoming/ outgoing calls.");
            $("#hangup").hide();
            $("#call").show();
        });


        /**
        * Ideally, we don't want to set a listener every time
        * Twilio.Device.incoming is called. Instead, we should
        * set a listener once and keep track of the current
        * connection.
        */
        var connection = null;

        Twilio.Device.incoming(function(conn) {
            // Set the reference to the current
            // connection when we receive an
            // incoming call
            connection = conn;
            $("#log").text("Incoming call from " + conn.parameters.From);
            $("#answer").show();
            $("#call").hide();
            $("#reject").show();

            // Clear the reference to the
            // connection when disconnected.
            connection.disconnect(function() {
                connection = null;
            })
        });

        Twilio.Device.cancel(function(conn) {
            $("#log").text("Ready");
            $("#answer").hide();
            $("#reject").hide();
            $("#call").show();
        });

        $("#reject").click(function() {
            $("#log").text("Incoming call is rejected. Ready for new incoming/ outgoing calls.");
            connection.reject();
            $("#answer").hide();
            $("#reject").hide();
            $("#call").show();


        });

        // Set the listener once.
        $("#answer").click(function() {
            // If there's no pending connection,
            // there's nothing to do.
            if (!connection) { return; }

            // Update the interface
            $("#answer").hide();
            $("#call").show();
            $("#log").text("Call accepted");

            // Accept the current connection.
            connection.accept();
        });

        $("#call").click(function() {
            // get the phone number to connect the call to
            params = {"PhoneNumber": $("#number").val()};
            Twilio.Device.connect(params);
        });

        $("#hangup").click(function() {
            Twilio.Device.disconnectAll();
            $("#log").text("Ready");
        });


    });

    </script>
</head>
<body>
<div align="center" style="margin: auto; width:500px; padding: 20px;">
    <div class="form-inline">
        <div class="input-group">
            <div class="input-group-addon"><img src="https://www.twilio.com/bundles/favicons/img/Twilio_16.png" /></div>
            <input type="text" class="form-control" id="number" name="number">
        </div>

        <button class="btn btn-success" id="answer">Accept</button>

        <button class="btn btn-success" id="call">Call</button>

        <button class="btn btn-danger" id="hangup">Hangup</button>

        <button class="btn btn-danger" id="reject">Reject</button>

    </div>
    <br>
    <div id="log" class="alert-info" style="width: 347px; font-size: large;"></div>
</div>


</body>
</html>

Twilio客户端
$(文档).ready(函数(){
$(“#答案”).hide();
$(“#挂断”).hide();
$(“#拒绝”).hide();
Twilio.Device.setup(“,{debug:true});
Twilio.设备准备就绪(功能(设备){
$(“#log”).text(“就绪”);
});
Twilio.Device.error(函数(错误){
$(“#log”).text(“错误:+Error.message”);
});
Twilio.设备连接(功能(连接){
$(“#log”).text(“成功建立呼叫”);
$(“#调用”).hide();
$(“#拒绝”).hide();
$(“#挂断”).show();
});
斜纹装置断开(功能(连接){
$(“#log”).text(“通话结束。准备好接听/接听新的来电”);
$(“#挂断”).hide();
$(“#调用”).show();
});
/**
*理想情况下,我们不希望每次都设置一个侦听器
*调用了Twilio.Device.incoming。相反,我们应该
*设置一次侦听器并跟踪当前
*连接。
*/
var连接=null;
Twilio.设备输入(功能(连接){
//将引用设置为当前值
//当我们收到
//来电
连接=连接;
$(“#log”).text(“来自”+conn.parameters.from的来电”);
$(“#答案”).show();
$(“#调用”).hide();
$(“#拒绝”).show();
//清除对
//断开连接时断开连接。
连接。断开(功能(){
连接=空;
})
});
Twilio.设备取消(功能(连接){
$(“#log”).text(“就绪”);
$(“#答案”).hide();
$(“#拒绝”).hide();
$(“#调用”).show();
});
$(“#拒绝”)。单击(函数(){
$(“#log”).text(“来电已被拒绝。准备好接听/接听新来电”);
connection.reject();
$(“#答案”).hide();
$(“#拒绝”).hide();
$(“#调用”).show();
});
//设置侦听器一次。
$(“#答案”)。单击(函数(){
//如果没有挂起的连接,
//没什么可做的。
if(!connection){return;}
//更新接口
$(“#答案”).hide();
$(“#调用”).show();
$(“#日志”).text(“接受呼叫”);
//接受当前连接。
connection.accept();
});
$(“#调用”)。单击(函数(){
//获取要将呼叫连接到的电话号码
params={“PhoneNumber”:$(“#number”).val();
Twilio.Device.connect(参数);
});
$(“#挂起”)。单击(函数(){
Twilio.Device.disconnectAll();
$(“#log”).text(“就绪”);
});
});
接受
呼叫
挂断
拒绝


我希望这会有帮助。

嘿,刚才看到你也问了另一个问题。你是否处理了Twilio.Connection对象上的断开连接事件以清除旧调用?嗨,感谢你在我的javascript中做出响应我有Twilio.Device.disconnect(函数(conn){console.log(“调用结束”);});我要玩一玩这个。当我发现一些东西时,我会告诉你的。仍然在与这个问题斗争任何运气感谢你终于抽出时间来尝试这个问题,它解决了。再次感谢你,Danielle嘿,
twilio api凭据
twilio应用程序sid
之间有什么区别吗?嗨@saiRam当您在twilio中为自定义twilio应用程序创建twiml应用程序时,会检索twilio应用程序sid,然后会为该应用程序生成应用程序sid。而api凭据是用来向twilio发出REST api请求和从twilio发出REST api请求的凭据。