我正与Twilio的Andr​​oid SDK,当我点击挂机按钮总是得到错误?不能拨号后断开呼叫?当我、我正、按钮、错误

2023-09-08 09:30:41 作者:爱一个人的苦涩

我已经成功地Twilio SDK为Android,但是当我试图与它调用它不连接,并显示错误消息的logcat我收到以下错误:

  1)无法挂断电话,由于错误code:70015,消息:pjsua_call_hangup():对象已存在(PJ_EEXISTS)

2)连接断开,错误code 31000和消息一般错误

当我打电话断开方法,如果我评论此方法然后我调用工作正常,我让调用这个两个错误发生,但如果我把这种方法phone.disconnect(),我得到如上图所示的错误。

这是我的方法,我现在用的拨打电话和断开通话。
 

//////拨打电话

 公共无效连接(字符串phoneNumber的){
地图参数=新的HashMap();
parameters.put(联系号码,phoneNumber的);
连接= device.connect(参数,空/ * ConnectionListener * /);
如果(连接== NULL)
Log.w(TAG,无法创建新的连接);
}
 

//要断开电话

 公共无效断开(){
如果(连接!= NULL){
connection.disconnect();
连接= NULL; //将空出的onDisconnected()
如果(basicConnectionListener!= NULL)
basicConnectionListener.onConnectionDisconnecting();
}
}
 

和我的OnClick事件:

 公共无效的onClick(视图查看){
如果(view.getId()== R.id.dialButton)
Toast.makeText(getApplicationContext(),拨号......,Toast.LENGTH_LONG).show();
phone.connect(电话号码);
如果(view.getId()== R.id.hangupButton)
Toast.makeText(getApplicationContext(),呼叫断开......,Toast.LENGTH_LONG).show();
phone.disconnect();

请建议我,帮助我,因为我尝试了所有可能的事情,聚会的场所,但仍然没有能够解决it.Thanks提前。 ![在此输入图片说明] [1]
 

解决方案

我分享我的工人阶级twillio SDK安装。

这是工作完美的我,我想和大家分享我的类,因此任何一个可以利用它引用了电话。

这是处理twillio呼叫的所有事件,并断开调用基类。

 进口的java.util.HashMap;
    进口的java.util.Map;

    进口android.content.Context;
    进口android.media.AudioManager;
    进口android.util.Log;
    进口android.view.Gravity;
    进口android.view.inputmethod.InputMethodManager;
    进口android.widget.Toast;

    进口com.twilio.client.Connection;
    进口com.twilio.client.Connection.State;
    进口com.twilio.client.ConnectionListener;
    进口com.twilio.client.Device;
    进口com.twilio.client.DeviceListener;
    。进口com.twilio.client presenceEvent;
    进口com.twilio.client.Twilio;

    公共类MonkeyPhone实现Twilio.InitListener,DeviceListener,ConnectionListener {
        私有静态最后字符串变量=MonkeyPhone;
        私有设备装置;
        专用连接的连接;
        私人最终上下文的背景下;
        私人BasicConnectionListener basicConnectionListener;
        私人BasicDeviceListener basicDeviceListener;
        专用连接pendingIncomingConnection;
        InputMethodManager IMM;
        私人布尔speakerEnabled;
        私人布尔muteEnabled;

        公共接口BasicConnectionListener {
            公共无效onIncomingConnectionDisconnected();

            公共无效onConnectionConnecting();

            公共无效onConnectionConnected();

            公共无效onConnectionFailedConnecting(异常错误);

            公共无效onConnectionDisconnecting();

            公共无效onConnectionDisconnected();

            公共无效onConnectionFailed(异常错误);
        }

        公共接口BasicDeviceListener {
            公共无效onDeviceStartedListening();

            公共无效onDeviceStoppedListening(异常错误);
        }

        公共MonkeyPhone(上下文的背景下){
            this.context =背景;
            Twilio.initialize(上下文,这个/ * Twilio.InitListener * /);
        }

        公共无效setListeners(BasicConnectionListener basicConnectionListener,BasicDeviceListener basicDeviceListener){
            this.basicConnectionListener = basicConnectionListener;
            this.basicDeviceListener = basicDeviceListener;
        }

        / * Twilio.InitListener方法* /
        @覆盖
        公共无效onInitialized(){
            Log.d(TAG,Twilio SDK已经准备好);
            尝试 {
                //字符串capabilityToken =
                // HttpHelper.httpGet(HTTP://------/mobile/auth.php);
                字符串capabilityToken = HttpHelper.httpGet(HTTP:------ / auth.php);

                设备= Twilio.createDevice(capabilityToken,空/ * DeviceListener * /);
            }赶上(例外五){
                Log.e(TAG,未能获取能力令牌:+ e.getLocalizedMessage());
            }
        }

        / * Twilio.InitListener方法* /
        @覆盖
        公共无效onerror的(例外五){
            Log.e(TAG,Twilio SDK无法启动:+ e.getLocalizedMessage());
        }

        @覆盖
        保护无效的finalize(){
            如果(设备!= NULL)
                device.release();
            如果(连接!= NULL)
                connection.disconnect();
        }

        //拨打电话

        公共无效连接(字符串phoneNumber的){
            吐司面包= Toast.makeText(背景下,拨号......,Toast.LENGTH_LONG);
            toast.setGravity(Gravity.CENTER,0,0);
            toast.show();
            地图<字符串,字符串>参数=新的HashMap<字符串,字符串>();
            parameters.put(联系号码,phoneNumber的);
            字符串capabilityToken;
            尝试 {
                // capabilityToken =
                // HttpHelper.httpGet(HTTP://------/mobile/auth.php);
                capabilityToken = HttpHelper.httpGet(HTTP://------/mobile/auth.php);

                设备= Twilio.createDevice(capabilityToken,空/ * DeviceListener * /);
            }赶上(例外E1){
                e1.printStackTrace();
            }
            尝试 {
                device.disconnectAll();
            }赶上(例外五){
                e.printStackTrace();
            }
            连接= device.connect(参数,空/ * ConnectionListener * /);
            如果(连接== NULL){
                Log.w(TAG,无法创建新的连接);
            }
        }

        //要断开电话
        公共无效断开(){
            吐司面包= Toast.makeText(背景下,呼叫断开......,Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER,0,0);
            toast.show();

            如果(连接!= NULL){
                connection.disconnect();
                连接= NULL; //将空出的onDisconnected()

                如果(basicConnectionListener!= NULL)
                    basicConnectionListener.onConnectionDisconnecting();
            }
        }

        公共无效setSpeakerEnabled(布尔speakerEnabled){
            如果(speakerEnabled!= this.speakerEnabled){
                this.speakerEnabled = speakerEnabled;
                updateAudioRoute();
            }
        }

        私人无效updateAudioRoute(){
            AudioManager audioManager =(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
            audioManager.setSpeakerphoneOn(speakerEnabled);
        }

        公共无效setMuteEnabled(布尔muteEnabled){
            如果(muteEnabled!= this.muteEnabled){
                this.muteEnabled = muteEnabled;
                updateAudioRouteForMute();
            }
        }

        私人无效updateAudioRouteForMute(){
            AudioManager audioManager =(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
            audioManager.setMicrophoneMute(muteEnabled);
        }

        公国的地位(){
            connection.getState();
            状态statusHere = connection.getState();
            返回statusHere;
        }

        @覆盖
        公共无效onConnected(连接为arg0){
            updateAudioRoute();
            updateAudioRouteForMute();
            如果(basicConnectionListener!= NULL){
                basicConnectionListener.onConnectionConnected();
            }
        }

        @覆盖
        公共无效onConnecting(连接为arg0){
            如果(basicConnectionListener!= NULL){
                basicConnectionListener.onConnectionConnecting();
            }
        }

        @覆盖
        公共无效onDisconnected(连接inConnection){
            如果(inConnection ==连接){
                连接= NULL;
                如果(basicConnectionListener!= NULL)
                    basicConnectionListener.onConnectionDisconnected();
            }否则,如果(inConnection == pendingIncomingConnection){
                pendingIncomingConnection = NULL;
                如果(basicConnectionListener!= NULL)
                    basicConnectionListener.onIncomingConnectionDisconnected();
            }
        }

        @覆盖
        公共无效onDisconnected(连接inConnection,INT ARG1,串inErrorMessage){
            如果(inConnection ==连接){
                连接= NULL;
                如果(basicConnectionListener!= NULL)
                    basicConnectionListener.onConnectionFailedConnecting(新的异常(inErrorMessage));
            }

        }

        @覆盖
        在presenceChanged公共无效(设备为arg0,presenceEvent ARG1){

        }

        @覆盖
        公共无效onStartListening(设备为arg0){
            如果(basicDeviceListener!= NULL){
                basicDeviceListener.onDeviceStartedListening();
            }
        }

        @覆盖
        公共无效onStopListening(设备为arg0){
            如果(basicDeviceListener!= NULL){
                basicDeviceListener.onDeviceStoppedListening(空);
            }
        }

        @覆盖
        公共无效onStopListening(设备为arg0,INT ARG1,串ARG2){

        }

        @覆盖
        公共布尔收到presenceEvents(设备为arg0){
            返回false;
        }

    }
 

您可以使用这个类,如:

 私人MonkeyPhone电话;
  //在创建
  手机=新MonkeyPhone(getApplicationContext());

  //在通话按钮点击

  @覆盖
    公共无效的onClick(视图查看){
        如果(view.getId()== R.id.btnCallHere){

            phone.connect(newContact);

        }否则,如果(view.getId()== R.id.btnDisconnectHere){

            phone.disconnect();

        }
 

I have successfully integrated Twilio SDK for android but when i am trying to make call with it its not connecting and showing error message in logcat i am getting following errors:

1) Failed to hangup call due to error code: 70015, message: pjsua_call_hangup(): Object already exists (PJ_EEXISTS) 

2) Connection disconnected with error code 31000 and message Generic error 

this both errors occurs when i am calling disconnect method if i comment this method then my calling is working fine and i make call but if i call this method phone.disconnect(), i am getting error shown as above. 

This is my methods which i am using to make calls and to disconnect the calls. 

////// To Make Calls

public void connect(String phoneNumber) { 
Map parameters = new HashMap(); 
parameters.put("PhoneNumber", phoneNumber); 
connection = device.connect(parameters, null /* ConnectionListener */); 
if (connection == null) 
Log.w(TAG, "Failed to create new connection"); 
} 

// To Disconnect Phone

public void disconnect() { 
if (connection != null) { 
connection.disconnect(); 
connection = null; // will null out in onDisconnected() 
if (basicConnectionListener != null) 
basicConnectionListener.onConnectionDisconnecting(); 
} 
} 

and on my OnClick event:

public void onClick(View view) { 
if (view.getId() == R.id.dialButton) 
Toast.makeText(getApplicationContext(), "Dialing...", Toast.LENGTH_LONG).show(); 
phone.connect("PHONE NUMBER"); 
if (view.getId() == R.id.hangupButton) 
Toast.makeText(getApplicationContext(), "Call Disconnected...", Toast.LENGTH_LONG).show(); 
phone.disconnect(); 

Please suggest me and help me because i tried all possible thing for hangout but still not able to solve it.Thanks in advance. ![enter image description here][1]

解决方案

I am sharing my working class for twillio SDK setup.

This the calls which is working perfectly for me.I would like to share my class so any one can take reference of it.

This is the Base class which handle all the events of twillio Calling and Disconnecting the call.

    import java.util.HashMap;
    import java.util.Map;

    import android.content.Context;
    import android.media.AudioManager;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.Toast;

    import com.twilio.client.Connection;
    import com.twilio.client.Connection.State;
    import com.twilio.client.ConnectionListener;
    import com.twilio.client.Device;
    import com.twilio.client.DeviceListener;
    import com.twilio.client.PresenceEvent;
    import com.twilio.client.Twilio;

    public class MonkeyPhone implements Twilio.InitListener, DeviceListener, ConnectionListener {
        private static final String TAG = "MonkeyPhone";
        private Device device;
        private Connection connection;
        private final Context context;
        private BasicConnectionListener basicConnectionListener;
        private BasicDeviceListener basicDeviceListener;
        private Connection pendingIncomingConnection;
        InputMethodManager imm;
        private boolean speakerEnabled;
        private boolean muteEnabled;

        public interface BasicConnectionListener {
            public void onIncomingConnectionDisconnected();

            public void onConnectionConnecting();

            public void onConnectionConnected();

            public void onConnectionFailedConnecting(Exception error);

            public void onConnectionDisconnecting();

            public void onConnectionDisconnected();

            public void onConnectionFailed(Exception error);
        }

        public interface BasicDeviceListener {
            public void onDeviceStartedListening();

            public void onDeviceStoppedListening(Exception error);
        }

        public MonkeyPhone(Context context) {
            this.context = context;
            Twilio.initialize(context, this /* Twilio.InitListener */);
        }

        public void setListeners(BasicConnectionListener basicConnectionListener, BasicDeviceListener basicDeviceListener) {
            this.basicConnectionListener = basicConnectionListener;
            this.basicDeviceListener = basicDeviceListener;
        }

        /* Twilio.InitListener method */
        @Override
        public void onInitialized() {
            Log.d(TAG, "Twilio SDK is ready");
            try {
                // String capabilityToken =
                // HttpHelper.httpGet("http://------/mobile/auth.php");
                String capabilityToken = HttpHelper.httpGet("http:------/auth.php");

                device = Twilio.createDevice(capabilityToken, null /* DeviceListener */);
            } catch (Exception e) {
                Log.e(TAG, "Failed to obtain capability token: " + e.getLocalizedMessage());
            }
        }

        /* Twilio.InitListener method */
        @Override
        public void onError(Exception e) {
            Log.e(TAG, "Twilio SDK couldn't start: " + e.getLocalizedMessage());
        }

        @Override
        protected void finalize() {
            if (device != null)
                device.release();
            if (connection != null)
                connection.disconnect();
        }

        // To Make Calls

        public void connect(String phoneNumber) {
            Toast toast = Toast.makeText(context, "Dialing...", Toast.LENGTH_LONG);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
            Map<String, String> parameters = new HashMap<String, String>();
            parameters.put("PhoneNumber", phoneNumber);
            String capabilityToken;
            try {
                // capabilityToken =
                // HttpHelper.httpGet("http://------/mobile/auth.php");
                capabilityToken = HttpHelper.httpGet("http://------/mobile/auth.php");

                device = Twilio.createDevice(capabilityToken, null /* DeviceListener */);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            try {
                device.disconnectAll();
            } catch (Exception e) {
                e.printStackTrace();
            }
            connection = device.connect(parameters, null /* ConnectionListener */);
            if (connection == null) {
                Log.w(TAG, "Failed to create new connection");
            }
        }

        // To Disconnect Phone
        public void disconnect() {
            Toast toast = Toast.makeText(context, "Call Disconnected...", Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();

            if (connection != null) {
                connection.disconnect();
                connection = null; // will null out in onDisconnected()

                if (basicConnectionListener != null)
                    basicConnectionListener.onConnectionDisconnecting();
            }
        }

        public void setSpeakerEnabled(boolean speakerEnabled) {
            if (speakerEnabled != this.speakerEnabled) {
                this.speakerEnabled = speakerEnabled;
                updateAudioRoute();
            }
        }

        private void updateAudioRoute() {
            AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
            audioManager.setSpeakerphoneOn(speakerEnabled);
        }

        public void setMuteEnabled(boolean muteEnabled) {
            if (muteEnabled != this.muteEnabled) {
                this.muteEnabled = muteEnabled;
                updateAudioRouteForMute();
            }
        }

        private void updateAudioRouteForMute() {
            AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
            audioManager.setMicrophoneMute(muteEnabled);
        }

        public State status() {
            connection.getState();
            State statusHere = connection.getState();
            return statusHere;
        }

        @Override
        public void onConnected(Connection arg0) {
            updateAudioRoute();
            updateAudioRouteForMute();
            if (basicConnectionListener != null) {
                basicConnectionListener.onConnectionConnected();
            }
        }

        @Override
        public void onConnecting(Connection arg0) {
            if (basicConnectionListener != null) {
                basicConnectionListener.onConnectionConnecting();
            }
        }

        @Override
        public void onDisconnected(Connection inConnection) {
            if (inConnection == connection) {
                connection = null;
                if (basicConnectionListener != null)
                    basicConnectionListener.onConnectionDisconnected();
            } else if (inConnection == pendingIncomingConnection) {
                pendingIncomingConnection = null;
                if (basicConnectionListener != null)
                    basicConnectionListener.onIncomingConnectionDisconnected();
            }
        }

        @Override
        public void onDisconnected(Connection inConnection, int arg1, String inErrorMessage) {
            if (inConnection == connection) {
                connection = null;
                if (basicConnectionListener != null)
                    basicConnectionListener.onConnectionFailedConnecting(new Exception(inErrorMessage));
            }

        }

        @Override
        public void onPresenceChanged(Device arg0, PresenceEvent arg1) {

        }

        @Override
        public void onStartListening(Device arg0) {
            if (basicDeviceListener != null) {
                basicDeviceListener.onDeviceStartedListening();
            }
        }

        @Override
        public void onStopListening(Device arg0) {
            if (basicDeviceListener != null) {
                basicDeviceListener.onDeviceStoppedListening(null);
            }
        }

        @Override
        public void onStopListening(Device arg0, int arg1, String arg2) {

        }

        @Override
        public boolean receivePresenceEvents(Device arg0) {
            return false;
        }

    }

You can use this class like:

  private MonkeyPhone phone;
  //On create
  phone = new MonkeyPhone(getApplicationContext());

  //On Call Button Click

  @Override
    public void onClick(View view) {
        if (view.getId() == R.id.btnCallHere) {

            phone.connect(newContact);  

        } else if (view.getId() == R.id.btnDisconnectHere) {

            phone.disconnect();

        }