CEC Android SDK API

消息

发送文本消息

//发送一条文本消息, content 为消息文字内容, toChatUsername为客服设置的IM服务号
Message message = Message.createTxtSendMessage(content, toChatUsername);
ChatClient.getInstance().chatManager().sendMessage(message, new Callback() {});

发送语音消息

//filePath为语音文件路径, length为录音时间(秒), toChatUsername为IM服务号
Message message = Message.createVoiceSendMessage(filePath, length, toChatUsername);
ChatClient.getInstance().chatManager().sendMessage(message, new Callback(){});

发送图片消息

//filePath为图片路径, false为不发送原图(默认超过100k的图片都会压缩后发给对方),需要发送原图传true, toChatUsername为IM服务号 
Message message = Message.createImageSendMessage(filePath, false, toChatUsername);
ChatClient.getInstance().chatManager().sendMessage(message, new Callback(){});

发送地理位置

//latitude为维度,longitude为经度,locAddress为具体位置内容, toChatUsername为IM服务号
Message message = Message.createLocationSendMessage(latitude, longitude, locAddress, toChatUsername);
ChatClient.getInstance().chatManager().sendMessage(message, new Callback(){});

发送文件消息

//filePath为本地文件路径,toChatUsername为IM服务号
Message message = Message.createFileSendMessage(filePath, toChatUsername);
ChatClient.getInstance().chatManager().sendMessage(message, new Callback(){});

发送转接客服消息

//toUserName是转接客服消息的Target客服(可以从收到的转接客服按钮消息中提取) , info是ToCustomServiceInfo的消息实体(收到的转接客服按钮消息内容中提取) 
Message message = Message.createTranferToKefuMessage(toUserName, info);
ChatClient.getInstance().chatManager().sendMessage(message, new Callback(){});

发送透传消息

Message message = Message.createSendMessage(Message.Type.CMD);
String action = "action";//具体的action
message.setBody(new EMCmdMessageBody(action));
message.setTo(toChatUsername);
ChatClient.getInstance().chatManager().sendMessage(message, new Callback(){});

发送扩展消息

任何消息类型,均可发送扩展消息。某些功能是通过扩展消息实现的,例如:指定技能组、指定客服、传递访客的昵称电话等。

说明:为不同的消息类型指定扩展消息时,需要避免冲突。例如:如果为轨迹消息和透传消息消息指定不同的技能组,而当两种消息同时为一位访客发送时,则会出现技能组指定错误。

Message message = Message.createTxtSendMessage(content, toChatUsername);
// 增加自己特定的属性
message.setAttribute("attribute1", "value");
ChatClient.getInstance().chatManager().sendMessage(message, new Callback() {});

发送带访客属性的消息

当需要为客服提供访客属性(昵称、电话等)时,需要为消息带上访客属性扩展。发送文本消息示例:

VisitorInfo info = ContentFactory.createVisitorInfo(null);
info.nickName("user nick")   //nickname不能为空
    .name("truly name")
    .qq("10000")
    .companyName("环信")
    .description("")
    .email("abc@123.com");

// 自定义字段传参集成用户信息 userDefineColumn 是 json 字符串 格式例如:"{\"WQQ\":\"帅哥\",\"QAZ\":\"LLLLLLLTTTTTTTT\"}"
JSONObject content = info.getContent();
// 创建数据,将数据设置给userDefineColumn
JSONObject object = new JSONObject();
// key是字段ID
object.put("WQQ","帅哥");
object.put("QAZ","LLLLLLLTTTTTTTT");
// 将userDefineColumn字段及对应的数据添加到VisitorInfo里
content.put("userDefineColumn",object.toString());

Message message = Message.createTxtSendMessage(content, toChatUsername);
message.addContent(info);
ChatClient.getInstance().chatManager().sendMessage(message, new Callback() {});

发送轨迹消息

VisitorTrack track = ContentFactory.createVisitorTrack(null);
track.title("test_track1")  //显示标题
    .price("¥235") //显示价格
    .desc("假两件衬衣+V领毛衣上衣") //描述
    .imageUrl("https://o8ugkv090.bkt.clouddn.com/em_three.png")//显示图片
    .itemUrl("https://www.baidu.com"); //点击会跳转到哪
    
// 获取内容,添加key-value
JSONObject content = track.getContent();
// 添加key-value
content.put("android","我是android表单预填写的值");

Message message = Message.createTxtSendMessage(content, toChatUsername);
message.addContent(track);

HashMap<String, Object> map = new HashMap<>();
//预填工单功能 一定要添加如下代码 不然没有这个功能
map.put("createTicketEnable",true);
// msgtype里添加值
message.addMsgTypeDictionary(map);

ChatClient.getInstance().chatManager().sendMessage(message, new Callback() {});

发送订单消息

OrderInfo info = ContentFactory.createOrderInfo(null);
info.title("test_order1")
    .orderTitle("订单号:7890")
    .price("¥128")
    .desc("2015早春新款高腰复古牛仔裙")
    .imageUrl(IMAGE_URL_1)
    .itemUrl("https://www.baidu.com");
    
// 获取内容,添加key-value
JSONObject content = info.getContent();
// 添加key-value
content.put("android","我是android表单预填写的值");

Message message = Message.createTxtSendMessage(content, toChatUsername);
message.addContent(info);

HashMap<String, Object> map = new HashMap<>();
//预填工单功能 一定要添加如下代码 不然没有这个功能
map.put("createTicketEnable",true);
// msgtype里添加值
message.addMsgTypeDictionary(map);

ChatClient.getInstance().chatManager().sendMessage(message, new Callback() {});

指定客服消息

调度时,指定某个客服。

客服账号为客服的登录邮箱地址。

AgentIdentityInfo info = ContentFactory.createAgentIdentityInfo(null);
info.agentName(agentName); //客服账号
Message message = Message.createTxtSendMessage(content, toChatUsername);
message.addContent(info);
ChatClient.getInstance().chatManager().sendMessage(message, new Callback() {});

指定技能组消息

调度时,指定某个技能组。

技能组名称须和客服系统设置的技能组名称完全一致,中英文均可。

QueueIdentityInfo info = ContentFactory.createQueueIdentityInfo(null);
info.queueName(queueName); // 技能组名称
Message message = Message.createTxtSendMessage(content, toChatUsername);
message.addContent(info);
ChatClient.getInstance().chatManager().sendMessage(message, new Callback() {});

接收消息

通过注册消息监听来接收消息。

ChatClient.getInstance().chatManager().addMessageListener(new ChatManager.MessageListener() {
    @Override
    public void onMessage(List<Message> list) {
        //收到普通消息
    }

    @Override
    public void onCmdMessage(List<Message> list) {
        //收到命令消息,命令消息不存数据库,一般用来作为系统通知,例如留言评论更新,
        //会话被客服接入,被转接,被关闭提醒
    }

    @Override
    public void onMessageStatusUpdate() {
        //消息的状态修改,一般可以用来刷新列表,显示最新的状态
    }

    @Override
    public void onMessageSent() {
        //发送消息后,会调用,可以在此刷新列表,显示最新的消息
    }
});
        
//不需要的时候移除listener,如在activity的onDestroy()时
ChatClient.getInstance().chatManager().removeMessageListener(msgListener);

检测消息类型

message.getType() == Message.Type.LOCATION  位置消息
message.getType() == Message.Type.FILE   文件消息
message.getType() == Message.Type.IMAGE  图片消息
message.getType() == Message.Type.VOICE  语音消息
message.getType() == Message.Type.CMD    命令消息
message.getType() == Message.Type.TXT    文本消息或文本扩展消息
//当文本消息时,需要其他其他的检测,可能为其他类型的消息
MessageHelper.getMessageExtType(message)可以获取额外的消息类型
enum ExtMsgType {
    EvaluationMsg,  //满意度评价消息
    OrderMsg,       //订单消息
    TrackMsg,       //轨迹消息
    FormMsg,        //表单信息
    RobotMenuMsg,   //机器人菜单信息
    ArticlesMsg,    //图文消息
    ToCustomServiceMsg,    //转接客服按钮消息
    BigExpressionMsg,      //大表情消息
    GeneralMsg      //普通的文本消息
}

监听消息状态

通过 message 设置消息的成功失败监听。

message.setMessageStatusCallback(new Callback(){});

获取聊天记录

Conversation conversation = ChatClient.getInstance().chatManager().getConversation(toChatUsername);
//获取此会话的所有消息
List<Message> messages = conversation.getAllMessages();
//SDK初始化加载的聊天记录为20条,到顶时需要去DB里获取更多
//获取startMsgId之前的pagesize条消息,此方法获取的messages SDK会自动存入到此会话中,APP中无需再次把获取到的messages添加到会话中
List<Message> messages = conversation.loadMessages(startMsgId, pageSize);

获取未读消息数量

Conversation conversation = ChatClient.getInstance().chatManager().getConversation(toChatUsername);
conversation.unreadMessagesCount()

未读消息数清零

Conversation conversation = ChatClient.getInstance().chatManager().getConversation(toChatUsername);
//指定会话消息未读数清零
conversation.markAllMessagesAsRead();
//把一条消息置为已读
conversation.markMessageAsRead(messageId);
//所有未读消息数清零
ChatClient.getInstance().chatManager().markAllConversationsAsRead();

获取消息总数

Conversation conversation = ChatClient.getInstance().chatManager().getConversation(toChatUsername);
//获取此会话在本地的所有的消息数量
conversation.getAllMsgCount()
//如果只是获取当前在内存的消息数量,调用
conversation.getAllMessages().size()

会话

获取所有会话

Map<String, Conversation> conversations = ChatClient.getInstance().chatManager().getAllConversations();

删除会话及聊天记录

//删除和某个user会话,如果需要保留聊天记录,传false
ChatClient.getInstance().chatManager().deleteConversation(username, true);
//删除当前会话的某条聊天记录
Conversation conversation = ChatClient.getInstance().chatManager().getConversation(toChatUsername);
conversation.removeMessage(deleteMsg.msgId);

更新会话为已读

/**
 * 在线聊天,通知坐席,消息标记已读
 * @param tenantId 租户id
 * @param sessionId 会话id
 * @param callBack 回调
 */
ChatClient.getInstance().chatManager().asyncMarkAllMessagesAsRead(String tenantId, String sessionId, ValueCallBack<String> callBack);

满意度评价

判断是否为满意度评价消息

if(MessageHelper.getEvalRequest(message) != null){
//通过Message获取满意度相关信息存在,则代表此条消息为满意度消息
}

评价此会话

可对此会话设置评分和标签(后台可修改添加标签)

EvaluationInfo evaluationInfo = MessageHelper.getEvalRequest(currentMessage);
 // 此对象含有满意度相关信息,例如:级别、标签列表等。
 
// currentDegree可以从evaluationInfo中选择,具体多少分,selectedTags代表具体的标签,在degree内,需后台设置后才会有。

MessageHelper.sendEvalMessage(currentMessage, "评价备注内容", currentDegree, selectedTags, new Callback());


// evaluateWay 评价方式:由前端传入,visitor访客主动评价,agent坐席邀请,system强制邀请访客点击关闭窗口或会话结束
MessageHelper.sendEvalMessage(Message message, String evaluateWay, String detail, EvaluationInfo.Degree degree, List<EvaluationInfo.TagInfo> selectedTags, List<EvaluationInfo.ResolutionParam> resolutionParams, final Callback callback)

详见:商城Demo: com.easemob.helpdeskdemo.ui.SatisfactionActivity

获取配置对应的接口

// 问题解决评价 通过页面设置,满意度评价 --> APP,微信,网页,通过如下接口返回勾选的名称
AgoraMessage.asyncProblemSolvingOnServiceSessionResolved(String tenantId, final ValueCallBack<String> callBack)


// 问题解决评价引导语,通过页面设置,通过如下接口获取设置值
AgoraMessage.asyncEvalSolveWord(String tenantId, String serviceSessionId, final ValueCallBack<String> callBack)


// 问题解决评价,通过页面设置,通过如下接口获取设置值
AgoraMessage.asyncResolutionParams(String tenantId, String serviceSessionId, final ValueCallBack<String> callBack)

// 满意度评分引导语,通过页面设置,通过如下接口获取设置值
AgoraMessage.asyncGreetingMsgEnquiryInvite(String tenantId, String serviceSessionId, final ValueCallBack<String> callBack)

详见:商城Demo: com.easemob.helpdeskdemo.ui.SatisfactionActivity

主动发起满意度评价邀请

ChatClient.getInstance().chatManager().asyncSendInviteEvaluationMessage(toChatUsername, null);

// serviceSessionId根据当前会话,进行语种翻译
ChatClient.getInstance().chatManager().asyncSendInviteEvaluationMessage(final String toChatUsername, String serviceSessionId, final Callback callback)

留言

获取所有留言

/**
 * 获取所有留言
 * @param projectId  留言ProjectId  进入“管理员模式 → 留言”,可以看到这个Project ID
 * @param targetUser    接入环信客服云使用的关联的IM服务号
 * @param page      第几页数据,从0开始
 * @param pageSize  每页显示的条数
 * @param callback
 */
ChatClient.getInstance().leaveMsgManager().getLeaveMsgs(projectId, targetUser, page, pageSize, new ValueCallBack<String>() {});

获取一条留言

/**
 * 获取一条留言
 * @param projectId 留言ProjectId  进入“管理员模式 → 留言”,可以看到这个Project ID
 * @param targetUser 接入环信移动客服系统使用的关联的IM服务号
 * @param ticketId 留言的id TicketEntity的id字段
 * @param callback
 */
ChatClient.getInstance().leaveMsgManager().getLeaveMsgDetail(projectId, targetUser, ticketId, new ValueCallBack<String>() {});

创建一个新的留言

/**
 * 创建一个新的留言
 *
 * @param postContent
 * @param projectId 留言ProjectId  进入“管理员模式 → 留言”,可以看到这个Project ID
 * @param imUser  接入环信移动客服系统使用的关联的IM服务号
 * @param callback
 */
ChatClient.getInstance().leaveMsgManager().createLeaveMsg(postContent, projectId, imUser, new ValueCallBack(){});

获取一个留言的所有评论

/**
 * 获取一个留言的所有评论 分页获取
 *
 * @param projectId 留言ProjectId  进入“管理员模式 → 留言”,可以看到这个Project ID
 * @param ticketId  留言ID
 * @param targetUser  接入环信客服云使用的关联的IM服务号
 * @param callback
 * @param page  第几页,页码从0开始
 * @param size  每页显示多少个
 */
ChatClient.getInstance().leaveMsgManager().getLeaveMsgComments(projectId, ticketId, targetUser, new ValueCallBack(){}, page, size);

给一个留言添加评论

/**
 * 给一个留言添加评论
 *
 * @param projectId         留言ProjectId  进入“管理员模式 → 留言”,可以看到这个Project ID
 * @param ticketId          留言ID
 * @param targetUser        接入环信客服云使用的关联的IM服务号
 * @param newCommentBodyJson
 * @param callback
 */
ChatClient.getInstance().leaveMsgManager().createLeaveMsgComment(projectId, ticketId, targetUser, newCommentBodyByJson, new ValueCallBack(){});

获取工作状态

/**
 * 是否显示留言信息(一般在上班显示联系客服界面,在下班情况下显示留言界面)
 * 返回true 为下班状态, 返回false为上班状态
 */
ChatClient.getInstance().leaveMsgManager().getWorkStatus(new ValueCallBack(){});

设置当前登录用户的推送昵称

更新当前用户的在苹果 APNS 推送的昵称 如果个人的昵称被更改,也要去环信服务器更新下 nickname 防止显示差异。

//此方法传入一个字符串String类型的参数,返回成功或失败的一个Boolean类型的返回值
ChatClient.getInstance().setPushNickname(nickname)

实时音视频

监听呼入通话

通过注册相应 action 的 BroadcastReceiver 来监听呼叫过来的通话,接到广播后开发者可以调起 APP 里的通话 Activity。

IntentFilter callFilter = new IntentFilter(ChatClient.getInstance().callManager().getIncomingCallBroadcastAction());
registerReceiver(new CallReceiver(), callFilter);
private class CallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 拨打方username
        String from = intent.getStringExtra("from");
        // call type
        String type = intent.getStringExtra("type");
        //跳转到通话页面
    }
}

接听通话

/**
 * 接听通话
 */
ChatClient.getInstance().callManager().acceptCall(new Callback(){});

拒绝接听

/**
 * 拒绝接听
 * 
 */
ChatClient.getInstance().callManager().endCall();

挂断通话

/**
 * 挂断通话
 */
ChatClient.getInstance().callManager().endCall();

暂停和恢复语音或视频数据传输

  • 暂停语音数据传输:
ChatClient.getInstance().callManager().pauseVoice();
  • 恢复语音数据传输:
ChatClient.getInstance().callManager().resumeVoice();
  • 暂停视频(图像)数据传输:
ChatClient.getInstance().callManager().pauseVideo();
  • 恢复视频(图像)数据传输:
ChatClient.getInstance().callManager().resumeVoice();

切换摄像头

视频通话时如果有前置摄像头,默认使用前置的,提供切换 API 切换到别的摄像头。

ChatClient.getInstance().callManager().switchCamera();

视频通话设置显示自己和对方图像的 surfaceView

// 设置自己的视频图像
ChatClient.getInstance().callManager().setLocalView(localSurfaceView);
// 设置非自己的视频图像
ChatClient.getInstance().callManager().setRemoteView(streamId, remoteSurfaceView);

视频通话设置显示自己和对方图像的 surfaceView

// 设置自己的视频图像
ChatClient.getInstance().callManager().setLocalView(localSurfaceView);
// 设置非自己的视频图像
ChatClient.getInstance().callManager().setRemoteView(streamId, remoteSurfaceView);

设置视频码率

// 设置最大视频码率
ChatClient.getInstance().callManager().setVideoMaxKbps({int videoMaxKbps});
// 设置最小视频码率
ChatClient.getInstance().callManager().setVideoMinKbps({int videoMinKbps});
// 设置最大音频码率
ChatClient.getInstance().callManager().setAudioMaxKbps({int audioMaxKbps});

监听视频流的回调

// 添加视频流变化监听,一般在onCreate中调用
ChatClient.getInstance().callManager().addDelegate(this);
// 取消监听视频流变化,一般在onDestroy方法中调用
ChatClient.getInstance().callManager().removeDelegate(this);
  
public interface CallManagerDelegate {
    // 当接收到有视频流加入时
    void onAddStream(MediaStream stream);
    // 当接收到有视频流取消时
    void onRemoveStream(MediaStream stream);
    // 当接收到有视频流更新时
    void onUpdateStream(MediaStream stream);
    // 当接收到视频聊天被挂断时
    void onCallEnd(int reason, String description);
    // 通知事件
    void onNotice(HMediaNoticeCode code, String arg1, String arg2, Object arg3);
    // 通知可能有:HMediaNoticeStats | HMediaNoticeReconn | HMediaNoticeDisconn | HMediaNoticeCustomMsg | HMediaNoticePoorQuality |HMediaNoticeOpenMicFail | HMediaNoticeOpenCameraFail | HMediaNoticeTakeCameraPicture
}

只需要语音通话,不需要视频通话

通话界面后,先调用此方法即可

CallOption callOption = new CallOption()
callOption.isVideoOff = true  //是否不启动摄像头
callOption.isMute = false; //是否静音
callOption.useBackCamera = false; //是否启用后置摄像头
callOption.videoHeight = .. //设置视频高度
callOption.videoWidth = .. // 设置视频宽度
ChatClient.getInstance().callManager.setCallOption(callOption);

取消视频邀请

// 当访客端主动取消视频的邀请时,可调用此接口
ChatClient.getInstance().chatManager().cancelVideoConferences({im服务号}, null);

共享桌面

1.在android 5.0以上可以使用共享桌面功能,共享桌面以单独的一路流发布出去。

2.共享桌面的api在CallManager类中。发布共享桌面, 需要输入使用共享桌面功能的当前的activity. callback会返回共享桌面操作是否成功。

public void publishWindow(final Activity activity, final Callback callback)

3.取消共享桌面

public void unPublishWindow(final Callback callback)

4.可以参考访客demo中VideoCallActivity类中的实现。

集成声网音视频(注意:SDK版本必须高于V1.3.0)

监听呼入通话

通过注册相应 action 的 BroadcastReceiver

// 通过注册相应 action 的 BroadcastReceiver 来监听呼叫过来的通话,接到广播后开发者可以调起 APP 里的通话 CallActivity页面
IntentFilter callFilter = new IntentFilter(ChatClient.getInstance().callManager().getIncomingCallBroadcastAction());
callFilter.addAction("calling.state");
registerReceiver(new CallReceiver(), callFilter);

public class CallReceiver extends BroadcastReceiver {
    boolean mIsOnLine;
    @Override
    public void onReceive(Context context, Intent intent) {
        if (!ChatClient.getInstance().isLoggedInBefore()){
            return;
        }
        String action = intent.getAction();
        if ("calling.state".equals(action)){
            // 防止正在通话中,又新发来视频请求,isOnLine代表是否接通通话中
            mIsOnLine = intent.getBooleanExtra("state", false);
        }else {
            //call type
            String type = intent.getStringExtra("type");
            boolean isVecVideo = intent.getBooleanExtra("isVecVideo", false);
            if ("video".equals(type)){// video call
                if (!mIsOnLine){
                    if (isVecVideo){
                        // 新版vec视频客服
                        VECKitCalling.callingResponse(context, intent);
                    }else {
                        // 旧版在线视频
                        Calling.callingResponse(context, intent);
                    }
                }
            }else if (AgoraMessage.TYPE_ENQUIRYINVITE.equalsIgnoreCase(type)){
                // 满意度评价
                VECKitCalling.callingEvaluation(context, intent.getStringExtra("content"));
            }
        }
    }
}

// 在线视频CEC。通话页面注册通知
AgoraMessage.newAgoraMessage().registerCecMessageNotify(String classKey, ICecMessageNotify message);
// 在线视频CEC。注销通知
AgoraMessage.newAgoraMessage().unRegisterCecMessageNotify(String classKey);

// 在线视频VEC。通话页面注册通知
AgoraMessage.newAgoraMessage().registerVecMessageNotify(String classKey, IVecMessageNotify message);
// 在线视频VEC。注销通知
AgoraMessage.newAgoraMessage().unRegisterVecMessageNotify(String classKey);

相关方法使用和集成参考http://docs.easemob.com/cs/300visitoraccess/androidui-1

或者 参考官网demo

欢迎语

获取企业欢迎语

ChatClient.getInstance().chatManager().getEnterpriseWelcome(new ValueCallBack<String>() {});

/**
 * 获取企业欢迎语(根据语种自动翻译)
 * String visitorUserName 访客登录用户名
*/
ChatManager.getInstance().getEnterpriseWelcome(String visitorUserName, final ValueCallBack<String> callback);

获取机器人欢迎语

注意:kefu-sdk-1.3.3.2版本以上(不包含1.3.3.2版本)使用如下方式获取机器人欢迎语接口

/**
 * 获取机器人欢迎语接口(根据语种自动翻译)
 * String imServiceNumber im服务号
 * String visitorUserName 访客登录用户名
 * ValueCallBack<JSONObject> callBack 回调函数
*/
ChatClient.getInstance().chatManager().getRobotWelcome(imServiceNumber, visitorUserName, callBack);
注意:接口返回的数据需要自行解析,显示到到屏幕上。详细代码参考kefu-easeui模块ChatFragment类requestRobotWelcome()方法

获取app关联中个性化会话设置的企业欢迎语

/**
  * APP关联设置中开启开关:个性化会话设置 --> 获取企业欢迎语
  * @param easeMobIMNumber IM服务号
  * @param visitorUserName 访客登录用户名
  * @param callback 回调函数
  */
ChatClient.getInstance().chatManager().getAppRelevanceEnterpriseWelcomeWithVisitorUserName(String easeMobIMNumber, String visitorUserName, final ValueCallBack<String> callback);

获取技能组菜单

/**
  * 获取技能组菜单(根据语种自动翻译)
  * tenantId 租户id
  * visitorUserName 登录用户名
  * callBack 回调函数
 */
AgoraMessage.getSkillGroupMenuWithVisitorUserName(String tenantId, String visitorUserName, ValueCallBack<String> callBack);

获取app关联中个性化会话设置的欢迎语菜单指定技能组

/**
  * APP关联设置中开启开关:个性化会话设置 --> 获取欢迎语菜单
  * @param easeMobIMNumber IM服务号
  * @param visitorUserName 登录用户名称
  * @param callBack 回调函数
  */
ChatClient.getInstance().chatManager().getAppRelevanceSkillGroupMenuWithVisitorUserName(String easeMobIMNumber, String visitorUserName,  final ValueCallBack<String> callBack);

获取当前会话ID

// toChatUsername 为IM服务号
ChatClient.getInstance().chatManager().getCurrentSessionId(toChatUsername, new ValueCallBack<String>() {});
当返回value为空时,则代表此会话不存在,也就是未咨询或者咨询已结束,下次咨询可先发欢迎语
当返回value不为空时,则返回的当前会话的会话ID,也就是说会话正在咨询中,不需要发送欢迎语

获取访客ID

// conversationId 为IM服务号,callBack回调函数
ChatClient.getInstance().chatManager().asyncVisitorId(conversationId, callBack);

关闭当前会话

// tenantId 租户ID,visitorId访客ID,serviceSessionId会话ID,callBack回调函数
ChatClient.getInstance().chatManager().asyncCecClose(tenantId, visitorId, serviceSessionId, callBack);

高级功能

显示排队人数

首先,初始化时,需要调用option.showVisitorWaitCount(),然后添加WaitListener.

ChatClient.getInstance().chatManager().addVisitorWaitListener(new ChatManager.VisitorWaitListener() {
    @Override
    public void waitCount(final int num) {
        if (getActivity() == null){
            return;
        }
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (num > 0){
                    tvTipWaitCount.setVisibility(View.VISIBLE);
                    tvTipWaitCount.setText(getString(R.string.current_wait_count, num));
                }else{
                    tvTipWaitCount.setVisibility(View.GONE);
                }
            }
        });
    }
});

显示坐席输入状态

首先,初始化时,需要调用options.showAgentInputState(),然后添加AgentInputListener.

注:“显示坐席输入状态”为企业版、旗舰版功能。

ChatManager.AgentInputListener agentInputListener = new ChatManager.AgentInputListener() {
    @Override
    public void onInputState(final String input) {
        if (getActivity() == null){
            return;
        }
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (input != null) {
                    titleBar.setTitle(input);
                } else {
                    if (!TextUtils.isEmpty(titleName)) {
                        titleBar.setTitle(titleName);
                    } else {
                        titleBar.setTitle(toChatUsername);
                    }
                }
            }
        });
    }
};
// 在onCreate中调用添加监听
ChatClient.getInstance().chatManager().addAgentInputListener(agentInputListener);
// 在onDestroy中调用移除监听    
ChatClient.getInstance().chatManager().removeAgentInputListener(agentInputListener);

初始化访客语种

初始化访客语种

/**
  * 初始化访客语种(登录成功后初始化语种)
  * @param tenantId 租户id
  * @param language 语言,参考文档 http://docs.easemob.com/cs/100agentmode/10conversation#智能翻译
  * @param appKey appKey
  * @param visitorUserName 注册时的用户名
  * @param callBack 回调
 */
AgoraMessage.asyncInitLanguage(String tenantId, String language, String appKey, String visitorUserName, ValueCallBack<String> callBack);