Android SDK 接入指南

接入视频:

快速开始下载demo源码体验:

https://github.com/qzlink/rtc2sip-android.git(包含语音通话和视频通话)

https://github.com/qzlink/qzlink-rtc2sip-android_audio.git(包含语音通话)

1. 前提条件

Android Studio 3.0 或以上版本

Android SDK API 等级 19 或以上支持

Android 4.4 或以上版本的移动设备

2. 准备开发环境

2.1 创建Android项目

2.2 集成SDK

2.2.1 集成WebRtc2Sip_v1.0.jar

WebRtc2Sip_v1.0.3.jar复制到libs目录下,依赖到项目中。

2.3 添加项目权限

<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>

2.4 防止代码混淆

在 app/proguard-rules.pro 文件中添加如下行,防止代码混淆:

-keep class io.agora.**{*;}-keep class com.highsip.webrtc2sip.**{*;}

3 API参考

3.1 WebRtc2SipInterface类

3.1.1 初始化sdk

/**   * @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);  }}

3.1.2 设置账号

/**   * @param uuid sdk账号   * @param uuid pwd密码  */setUUidAndPassword(String uuid,String pwd)

3.1.3 设置AppID

/**   * @param appID sdk账号   */setAppID(String appID )

3.1.4 连接IM服务器 WebRtc2SipInterface.connectIMServers(host, port, web_port);

描述:连接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());

3.1.5 设置最大重连次数

注:需在connectIMServers前调用

/**    * 设置tcp连接的最大重连次数,默认为Integer.MAX_VALUE   * @param limit 重连的最大次数    */setMaxReconnectionLimit(int limit)

3.1.6 发送消息

/**    *发送消息   *  @param targetid 目标ID   * @param content 消息内容    * @param msgType 消息类型   * @param onSendMsgCallBack 发送消息回调 errorCode:0(发送成功)-1(发送失败)   */ sendMsg(String targetid, String content, String msgType,OnSendMsgCallBack onSendMsgCallBack)

3.1.7 呼叫

/**  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)

3.1.8 电话接通

/**     *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)

3.1.9 电话挂断

/**     *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)

3.1.10 电话响铃

/**     *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。

3.1.11 拒绝接听

/**     *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)

3.1.12 用户正忙

/**     *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)

3.1.13 断开TCP连接

 disconnectTcp();

3.1.14 获取APPID

 getAgoraAppId()

3.1.15 获取会议号

/**  *   * @param onGetConfCallBack  */ getConfNo(OnGetConfCallBack onGetConfCallBack)public interface OnGetConfCallBack {	/**	 *	 * @param errCode 错误代码("0"代表成功,"-1"代表失败)	 * @param errMsg 错误信息	 * @param confNo 会议号	 */    void onGetConf(String errCode, String errMsg, String confNo);}

3.1.15 邀请成员进入会议聊天

/** * * @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);}

3.1.16 获取固话接入号

/** *  * @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);}

3.1.17 获取会议成员列表

/** *  * @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}

3.1.18 通过房间号获取会议号

/** *  * @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;//会议创建时间	}

3.1.19 获取会议记录

/** * * @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

3.1.20 获取会议记录详情

/** *  * @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}

3.1.21 消息监听

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(未响应)

3.1.22 加入房间的时机

第一种:可选择在收到EnumKey.MsgTag.sip_ringing信令的时候加入

第二种 : 可选择在收到EnumKey.MsgTag.sip_connected信令的时候加入

具体可参考demo中AudioChatActivity中onReceiveMsg的回调实现

3.1.23 发送DTMF消息

/** * 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)

3.2 RtcEngine类(设置通话类)

3.2.1 设置免提

/**  * 开启/关闭 扬声器   * true:开启  * false:关闭   * 默认为关闭*/setEnableSpeakerphone(boolean flag)

3.2.2 开始录音

/*  *@param filePath:录音文件在本地保存的绝对路径,由用户自行制定,需精确到文件名及格式,例如:/dir1/dir2/dir3/audio.aac  *@param quality:0低音质,1中音质,2高音质*/startAudioRecording(String filePath, int quality)

3.3.3 关闭录音

/**  关闭录音*/stopAudioRecording()

3.3.4 开启音频

enableAudio()

3.3.5 关闭音频

disableAudio()

3.3.6 开启/关闭静音

/**  * true开启,false关闭  */muteLocalAudioStream(boolean muted)

3.3.7 设置场景模式和用户角色(必须在joinChanner之前调用)

mRtcEngine.setChannelProfile(1);//
设置场景模式为直播模式mRtcEngine.setClientRole(1);//设置用户角色为主播

3.3.8 设置采集音量大小(必须在joinChanner之前调用)

/** * @brief 设置采集音量 * @param volume 调节音量的参数值范围是 0 - 400 400 表示原始音量的 4 倍 * @return 0:成功  <0:失败 */ mRtcEngine.adjustRecordingSignalVolume(400);//设置范围0-400