本文为您介绍了在Android开发时,SDK的使用说明及示例。

创建实例

//context建议传入Application,设置成单例对象
AlicomRTC alicomRTC = new AlicomRTC(context);
说明 AlicomRTC实例一旦需要重新创建新的实例请先destroy旧的实例再创建新的防止出现业务混乱。
参数描述:
参数 类型 说明
context Context 传ApplicationContext对象

设置参数与回调(可选)

//添加一个监听服务状态的回调
alicomRTC.addListener(new ServiceListener() {
        //服务连接成功,当前处于可用状态
        @Override
        public void onServiceAvailable() {}
        //服务连接失败、或者连接断开了,正在销毁资源,当前处于不可操作
        @Override  
        public void onServiceUnavailable(int errCode, String errMsg) {}
        //服务已销毁完成,当前处于未连接状态
        @Override  
        public void onServiceIdle(){}
        //收到点对点音频来电
        @Override   
        public void onReceivingAudioCall(Call call){}                                     
    });
//可选,设置默认的呼叫超时时间
alicomRTC.setDefaultCallTimeout(60);
参数描述:
参数 类型 说明
serviceListener ServiceListener 传监听服务状态的回调。

连接服务

/*
 *连接服务,有账号模式需调用initWithRtcId传入融合通信账号,
 *无账号模式则调用initWithCustomId传入自定义账号,
 *以及TokenUpdater的实现用于获取token
 *(Token的具体获取过程由接入方自己实现,
 *由接入方app从接入方服务端获取,
 *而服务端通过pop服务从云通信获取)。
 *SDK每过一段时间就会请求新的token,
 *接入方需要实现方法实时获取id对应最新token。
 *连接成功时会在第2步添加的ServiceListener中回调。
 */
TokenUpdater tokenUpdater =  new TokenUpdater() {
    @Override
    public void updateToken (TokenHandler tokenHandler){
        //get latest token string from network, then
        tokenHandler.setToken(Token.fromJsonString(latestTokenString));
    }
};
//调用此方法进行初始化连接
alicomRTC.initWithRtcId(RtcId, tokenUpdater);
参数描述:
参数 类型 说明
rtcId String 调用AddRtcAccount接口创建获取rtcId。
tokenUpdater TokenUpdater 更新token回调,获取tokenHandler来更新token,用Token.fromJsonString函数来将字符串格式的token转成Token对象。
注意 tokenUpdater回调函数的实现,更新的token设置一定要保证是token最新的有效token,尽量避免获取token超时的情况。

开始通话

ServiceListener中的onServiceAvailable回调被唤起时,表示服务已经连接成功,此时可以开始发起各类通话。
  • 发起voip2pstn呼叫
    • 自有线路
      //customLineName为自有线路名称,targetShowNumber为被叫方显示的来电号码,需要从云通信购买可用号码
      alicomRTC.builder().pstnCall(customLineName,targetShowNumber, targetPhoneNumber).listener(listener).build().start();
      参数描述:
      参数 类型 说明
      customLineName String 自有线路名称。
      targetShowNumber String 被叫号显,被叫方显示的来电号码。
      targetPhoneNumber String 被叫电话号码。
    • 非自有线路
      //targetShowNumber为被叫方显示的来电号码,需要从云通信购买可用号码
      alicomRTC.builder().pstnCall(customLineName,targetShowNumber, targetPhoneNumber).listener(listener).build().start();
      参数描述:
      参数 类型 说明
      targetShowNumber String 被叫号显,被叫方显示的来电号码。
      targetPhoneNumber String 被叫电话号码。
  • 接听电话
    1.//在ServiceListener中
    public void onReceivingAudioCall(Call call) {
        call.start();
    }
  • 挂断/拒绝电话
    call.stop();
  • 销毁服务
    alicomRTC.destroy();
  • 本地静音,使自己静音,使对方无法听到自己的声音,别人不会知道,与Participant中的mute属性无关
    call.muteLocalAudiocall();
  • 使自己取消本地静音状态
    call.unmuteLocalAudio();
  • 打开或关闭扬声器
    call.speakerOn(boolean on);
    参数描述
    参数 类型 说明
    on boolean true表示打开扬声器,false表示关闭扬声器。
  • 开启pstn电话服务端录音
    pstnCallBuilder.serverRecordEnabled(true)
    参数描述
    参数 类型 说明
    on boolean true表示开启服务端录音,false表示不开启服务端录音。
  • 判断当前是否是本地静音状态
    call.isLocalAudioMuted()
  • 获取当前通话设置中扬声器是否打开
    call.isSpeakerOn()
  • 设置通话CallListener监听
    call.setCallListener(new AbstractAutoAnswerServiceListener() {
                //需要自动接听的号码列表
                @Override
                public List<String> getAutoAnswerCallerNumbers() {
                    return numbers;
                }
    
                //接收到正常电话(非自动接听号码列表的电话)
                @Override
                public void onReceivingCall(Call call) {
                    
                }
    
                //自动接听的电话
                @Override
                public void onAutoAnswered(Call call) {
                    
                }
    
                            //服务连接成功,当前处于可用状态
                @Override
                public void onServiceAvailable() {
                    
                }
                            //服务连接失败、或者连接断开了,正在销毁资源,当前处于不可操作
                @Override
                public void onServiceUnavailable(int errCode, String errMsg) {
    
                }
                            //服务已销毁完成,当前处于未连接状态
                @Override
                public void onServiceIdle() {
                    
                }
            };
    注意 安卓9.0系统对App退后台的麦克风做了限制,为防止通话的时候程序退后台引起的通话被静音问题,请在App退后台情况下发送前台通知来防止通话被静音。

API概述

入口
  • 类AlicomRTC为API入口,包含初始化服务、添加生命周期回调、销毁服务、设置全局默认属性、构建通话入口以及一些全局公共方法。
  • 类TokenUpdater是接入方需要实现的获取最新token的方法,sdk在需要时会唤起该回调获取最新token,接入方在获取到最新token串后可以调用Token.fromJsonString()方法快捷的获取实例并调用TokenHandler.setToken()方法设置token。1
  • 调用AlicomRTC.builder方法可以获得构建器用于创建各类通话,并可以设置部分参数。2
  • 通信
    融合通信服务SDK将不同通话功能与类型分拆到了相应的类。比如VideoCall就表示视频点对点通话,包含了视频点对点通话中所有的操作方法,每一个该类的实例表示具体的一次通话,不可重复使用。而基类Talk与VideoTalk分别定义了音频与视频通话的公共方法,没有对应的具体实现3
  • 监听
    • 接口TalkListener中定义了所有公共回调,具体类型的监听回调接口都继承与该接口。4
    • 每一个具体的通话类型都对应一个事件监听回调,接入方可以在构建通话时设置监听,也可以调用相应set方法设置监听。5

    其他API,请参见API Reference

错误码

错误码 含义
1000100 MQTT网络连接失败
1000101 消息发送失败
1000102/1000103/1000104 TOKEN无效/TOKEN获取失败/TOKEN上传失败(统归TOKEN更新失败)
1000105 MQTT连接断开
1000106 MQTT订阅topic失败
2000000 本地主动挂断
2000050 当前版本不支持视频
2000099 对端主动挂断
2000100 本端主叫时,不要拨打自己
2000101 本端主叫时,拨打的号码为空
2000102 连接媒体服务器超时
2000103 本端被叫时,本地超时未响应,于是本地主动拒绝
2000104 本端主叫时,被叫不在线
2000105 本端被叫时,接听发生错误
2000106 本端主叫时,被叫拒绝
2000107 本端被叫时,主叫取消
2000108 本端主叫时,被叫无响应
2000109 本端主叫时,被叫正在通话中
2000110 本端主叫时,被叫版本过低
2000111/2000112 roomId为空/被踢下线(多方通话的错误码)
2000113 当前服务处于不可用状态
2000116 本地主动销毁服务,以及导致的正在进行的通话中断
2000117 状态不对,当前有别的通话正在进行中,无法进行新的通话
2000118 被叫太多
2000120 自定义消息为空或长度超过1024
2000121 网络异常
2000122 对方接收自定义消息失败
2000130 没有录音权限
2000131 没有相机权限
2000132 主叫呼叫多个被叫时,对于被叫,该通呼叫已被其他设备接听
2000133 主叫呼叫多个被叫时,对于被叫,该通呼叫已被其他设备拒绝
2000134 本地主动销毁服务
2000135 没有麦克风设备
2000136 浏览器不允许使用麦克风
2000137 系统禁用麦克风或者麦克风被占用
3110000 当前账号在别处登录,被踢了,以及导致正在进行的通话中断
3110001 服务异常
3999999 服务器系统异常
3100000 被叫未注册/未登录
3100001 主叫通话异常
3100002 参数不正确
3100003 TOKEN验证失败
3100004 账号错误
3100005 业务停机
3100006 无效号显
3100007 无权操作
3100009 未订购对应产品
3100018/3100019 多方通话的错误码
3100020 被叫不合法
3100021 被叫连接媒体失败
3000000-3300000间别的错误码 服务端其他错误
3900000-4200000 媒体连接失败
8000000 未知错误

常见问题

  1. 事件回调会在什么线程回调呢?

    SDK中所有的Listener回调都会在主线程回调到接入方。

  2. 每次SDK回调需要更新Token时都要向服务端获取最新的Token吗?

    需要获取最新的Token。

  3. 可以实例化多个AlicomRTC吗?

    建议您将AlicomRTC作为单例使用,否则多个实例间会造成Token互斥以及底层资源冲突。