https://github.com/qzlink/rtc2sip-android.git(包含语音通话和视频通话)
https://github.com/qzlink/qzlink-rtc2sip-android_audio.git(包含语音通话)
Android Studio 3.0 或以上版本
Android SDK API 等级 19 或以上支持
Android 4.4 或以上版本的移动设备
将WebRtc2Sip_v1.0.3.jar复制到libs目录下,依赖到项目中。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="io.agora.tutorials1v1acall"><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- The Agora SDK requires Bluetooth permissions in case users are using Bluetooth devices.--><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />...</manifest>
在 app/proguard-rules.pro 文件中添加如下行,防止代码混淆:
-keep class io.agora.**{*;}-keep class com.highsip.webrtc2sip.**{*;}
/*** @param context*/init(Context context)
示例描述:sdk初始化在Application类oncreat()中调用:WebRtc2SipInterface.init(Context context);
public class App extends Application {@Override public void onCreate() {super.onCreate();//一、初始化SDKWebRtc2SipInterface.init(this);}}
/*** @param uuid sdk账号* @param uuid pwd密码*/setUUidAndPassword(String uuid,String pwd)
/*** @param appID sdk账号*/setAppID(String appID )
描述:连接IM服务器需要传入tcp的ip地址,TCP端口,HTTP端口,获取成功则进行信令服务器连接,连接成功后进行登录操作注:调用该方法前需先调用setUUid(),setAppID()
public interface ConnectIMCallBack {/*** @param statusCode 1(连接成功)* 2(连接关闭)* 0(连接错误)* 3 (连接中)* 4 (连接超时)*/void onConnectStatus(int statusCode);}public interface OnLoginStatusCallBack {/*** @param errorCode errorCode: 0(登录成功), -1(登录失败),-2(账号不合法)* @param errorMsg 错误信息*/void onLoginStatus(String errorCode, String errorMsg);}
调用:WebRtc2SipInterface.setOnConnectIMCallBack(new OnConnectIMCallBack());
WebRtc2SipInterface.setOnLoginStatusCallBack(new OnLoginStatusCallBack());
注:需在connectIMServers前调用
/*** 设置tcp连接的最大重连次数,默认为Integer.MAX_VALUE* @param limit 重连的最大次数*/setMaxReconnectionLimit(int limit)
/***发送消息* @param targetid 目标ID* @param content 消息内容* @param msgType 消息类型* @param onSendMsgCallBack 发送消息回调 errorCode:0(发送成功)-1(发送失败)*/sendMsg(String targetid, String content, String msgType,OnSendMsgCallBack onSendMsgCallBack)
/**Sip呼叫* @param phoneNum 电话号码* @param isOpenSip 是否为Sip呼叫* @param callType 呼叫类型 "VIDEO","AUDIO"* @param ip 坐席信息包括IP和端口*/sipCall(String phoneNum, boolean isOpenSip,String callType,String ip)
WebRtc2SipInterface.setOnSipCallCallBack(new OnSipCallCallBack());/*** 电话呼叫回调* @param SipBean(呼叫返回的实体类), bean里面包含了errorCode:0(呼叫成功)-1(呼叫失败)*/onSipCall(SipBean bean)
/***Sip接听* @param caller 主叫* @param callee 被叫* @param callType 呼叫类型* @param isSip 是否Sip呼叫* @param roomID 房间号* @param direction 呼入呼出*/sipAnswerCall(String caller, String callee, String callType, String isSip, String roomID, String direction)
/***Sip挂断* @param caller 主叫* @param callee 被叫* @param callType 呼叫类型* @param isSip 是否Sip呼叫* @param roomID 房间号* @param direction 呼入呼出*/sipDisconnect(String caller, String callee, String callType, String isSip, String roomID, String direction)
/***Sip响铃* @param caller 主叫* @param callee 被叫* @param callType 呼叫类型* @param isSip 是否Sip呼叫* @param roomID 房间号* @param direction 呼入呼出*/sipRinging(String caller, String callee, String callType, String isSip, String roomID, String direction)
注:该信令用于接收到来电呼叫时,向主叫方发送具体可参考demo。
/***Sip拒接* @param caller 主叫* @param callee 被叫* @param callType 呼叫类型* @param isSip 是否Sip呼叫* @param roomID 房间号* @param direction 呼入呼出*/sipReject(String caller, String callee, String callType, String isSip, String roomID, String direction)
/***Sip用户正忙* @param caller 主叫* @param callee 被叫* @param callType 呼叫类型* @param isSip 是否Sip呼叫* @param roomID 房间号* @param direction 呼入呼出*/sipUserBusy(String caller, String callee, String callType, String isSip, String roomID, String direction)
disconnectTcp(); getAgoraAppId()/**** @param onGetConfCallBack*/getConfNo(OnGetConfCallBack onGetConfCallBack)public interface OnGetConfCallBack {/**** @param errCode 错误代码("0"代表成功,"-1"代表失败)* @param errMsg 错误信息* @param confNo 会议号*/void onGetConf(String errCode, String errMsg, String confNo);}
/**** @param confNo 会议号* @param phoneList 电话集合* @param type ("phone"电话呼叫,"sip"内网呼叫)* @param sponsorConfCallBack*/sponsorConf(String confNo,List<String> phoneList, String type,SponsorConfCallBack sponsorConfCallBack)public interface SponsorConfCallBack {/**** @param errCode 错误代码("0"代表成功,"-1"代表失败)* @param errMsg 错误信息*/void onSponsorConf(String errCode,String errMsg);}
/**** @param confNo 会议号* @param onGetConfDiDCallBack*/getConfDiD(String confNo, OnGetConfDiDCallBack onGetConfDiDCallBack)public interface OnGetConfDiDCallBack {/**** @param confDiD 固话接入号* @param errCode 错误代码("0"代表成功,"-1"代表失败)* @param errMsg 错误信息*/void getConfDiD(String confDiD, String errCode, String errMsg);}
/**** @param confNo 会议号* @param callBack*/getConfMemberList(final String confNo,OnGetConfMemberListCallBack callBack)public interface OnGetConfMemberListCallBack {/**** @param errCode 错误代码("0"代表成功,"-1"代表失败)* @param errMsg 错误信息* @param list*/void onGetConfMemberList(String errCode, String errMsg, ArrayList<MemberBean> list);}public class MemberBean {private String phoneNum;//电话号码private String callstate;//呼叫状态("conf_hangup"挂断状态)private String uuid;//用户uuidprivate String conference_uuid;//会议uuid}
/**** @param roomid 房间号* @param callBack*/getConfInfoByRoomID(String roomid, OnGetConfInfoByRoomIDCallBack callBack)public interface OnGetConfInfoByRoomIDCallBack {/**** @param errCode 错误代码("0"代表成功,"-1"代表失败)* @param confBean*/void onGetConfInfo(String errCode, ConfBean confBean);}public class ConfBean {private String conference_uuid;//会议uuidprivate String confNo;//会议号private String conference_name;//会议名称private int run_time;//会议时长private String gmt_create;//会议创建时间}
/**** @param pageNumber 第几页* @param pageSize 每页获取的数量* @param orderDirection "desc"降序,"ase"升序* @param onGetConfHistCallBack*/confMemberHisPage(String pageNumber, String pageSize, String orderDirection, OnGetConfHistCallBack onGetConfHistCallBack)public interface OnGetConfHistCallBack {/**** @param errCode 错误代码("0"代表成功,"-1"代表失败)* @param lastPage 是否最后一页* @param list 会议记录*/void getConfHis(String errCode,boolean lastPage, List<ConfBean> list);}ConfBean请参考3.1.18
/**** @param conferenceUUID 会议uuid* @param callBack*/getConfHisDetail(String conferenceUUID,OnGetConfHisDetailCallBack callBack)public interface OnGetConfHisDetailCallBack {/**** @param errCode 错误代码("0"代表成功,"-1"代表失败)* @param bean*/void getConfHisDetail(String errCode, ConfDetailBean bean);}public class ConfDetailBean {private String sponsor;//发起人private ConfBean mConfBean;//请参考3.1.18private List<MemberBean> list;//请参考3.1.17}
public interface OnReceiveMessageListener {/*** @param msg json消息**/void onReceiveMessage(String msg);}被叫:msgTag:EnumKey.MsgTag.sip_ringing(响铃)EnumKey.MsgTag.sip_connected(通话连接)EnumKey.MsgTag.sip_rejected(拒接)EnumKey.MsgTag.sip_disconnected(挂断)EnumKey.MsgTag.sip_no_response(未响应)主叫:msgTag:EnumKey.MsgTag.sip_ringing_res(响铃)EnumKey.MsgTag.sip_connected_res(通话连接)EnumKey.MsgTag.sip_rejected_res(拒接)EnumKey.MsgTag.sip_disconnected_res(挂断)EnumKey.MsgTag.sip_no_response_res(未响应)
第一种:可选择在收到EnumKey.MsgTag.sip_ringing信令的时候加入
第二种 : 可选择在收到EnumKey.MsgTag.sip_connected信令的时候加入
具体可参考demo中AudioChatActivity中onReceiveMsg的回调实现
/*** sip发送DTMF消息** @param caller 主叫* @param callee 被叫* @param callType 呼叫类型* @param isSip 是否Sip呼叫* @param roomID 房间号* @param dtmf dtmf消息*/sipDTMF(String caller, String callee, String callType, String isSip, String roomID, String dtmf)
/*** 开启/关闭 扬声器* true:开启* false:关闭* 默认为关闭*/setEnableSpeakerphone(boolean flag)
/**@param filePath:录音文件在本地保存的绝对路径,由用户自行制定,需精确到文件名及格式,例如:/dir1/dir2/dir3/audio.aac*@param quality:0低音质,1中音质,2高音质*/startAudioRecording(String filePath, int quality)
/**关闭录音*/stopAudioRecording()
enableAudio()disableAudio()/*** true开启,false关闭*/muteLocalAudioStream(boolean muted)
mRtcEngine.setChannelProfile(1);// 设置场景模式为直播模式mRtcEngine.setClientRole(1);//设置用户角色为主播
/*** @brief 设置采集音量* @param volume 调节音量的参数值范围是 0 - 400 400 表示原始音量的 4 倍* @return 0:成功 <0:失败*/mRtcEngine.adjustRecordingSignalVolume(400);//设置范围0-400