====== 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 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 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 list) { //收到普通消息 } @Override public void onCmdMessage(List 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 messages = conversation.getAllMessages(); //SDK初始化加载的聊天记录为20条,到顶时需要去DB里获取更多 //获取startMsgId之前的pagesize条消息,此方法获取的messages SDK会自动存入到此会话中,APP中无需再次把获取到的messages添加到会话中 List 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 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 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 selectedTags, List resolutionParams, final Callback callback) 详见:商城Demo: com.easemob.helpdeskdemo.ui.SatisfactionActivity ==== 获取配置对应的接口 ==== // 问题解决评价 通过页面设置,满意度评价 --> APP,微信,网页,通过如下接口返回勾选的名称 AgoraMessage.asyncProblemSolvingOnServiceSessionResolved(String tenantId, final ValueCallBack callBack) // 问题解决评价引导语,通过页面设置,通过如下接口获取设置值 AgoraMessage.asyncEvalSolveWord(String tenantId, String serviceSessionId, final ValueCallBack callBack) // 问题解决评价,通过页面设置,通过如下接口获取设置值 AgoraMessage.asyncResolutionParams(String tenantId, String serviceSessionId, final ValueCallBack callBack) // 满意度评分引导语,通过页面设置,通过如下接口获取设置值 AgoraMessage.asyncGreetingMsgEnquiryInvite(String tenantId, String serviceSessionId, final ValueCallBack 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() {}); ==== 获取一条留言 ==== /** * 获取一条留言 * @param projectId 留言ProjectId 进入“管理员模式 → 留言”,可以看到这个Project ID * @param targetUser 接入环信移动客服系统使用的关联的IM服务号 * @param ticketId 留言的id TicketEntity的id字段 * @param callback */ ChatClient.getInstance().leaveMsgManager().getLeaveMsgDetail(projectId, targetUser, ticketId, new ValueCallBack() {}); ==== 创建一个新的留言 ==== /** * 创建一个新的留言 * * @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 visitorUserName 访客登录用户名 */ ChatManager.getInstance().getEnterpriseWelcome(String visitorUserName, final ValueCallBack callback); ==== 获取机器人欢迎语 ==== 注意:kefu-sdk-1.3.3.2版本以上(不包含1.3.3.2版本)使用如下方式获取机器人欢迎语接口 /** * 获取机器人欢迎语接口(根据语种自动翻译) * String imServiceNumber im服务号 * String visitorUserName 访客登录用户名 * ValueCallBack 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 callback); ==== 获取技能组菜单 ==== /** * 获取技能组菜单(根据语种自动翻译) * tenantId 租户id * visitorUserName 登录用户名 * callBack 回调函数 */ AgoraMessage.getSkillGroupMenuWithVisitorUserName(String tenantId, String visitorUserName, ValueCallBack callBack); ==== 获取app关联中个性化会话设置的欢迎语菜单指定技能组 ==== /** * APP关联设置中开启开关:个性化会话设置 --> 获取欢迎语菜单 * @param easeMobIMNumber IM服务号 * @param visitorUserName 登录用户名称 * @param callBack 回调函数 */ ChatClient.getInstance().chatManager().getAppRelevanceSkillGroupMenuWithVisitorUserName(String easeMobIMNumber, String visitorUserName, final ValueCallBack callBack); ==== 获取当前会话ID ==== // toChatUsername 为IM服务号 ChatClient.getInstance().chatManager().getCurrentSessionId(toChatUsername, new ValueCallBack() {}); 当返回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 callBack);