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();
//一、初始化SDK
WebRtc2SipInterface.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;//用户uuid
private 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;//会议uuid
private 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.18
private 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