会话管理
会话控制
本节说明主动请求客服、结束会话、转接客服、退出排队等会话控制能力。
控制会话
SDK 的会话控制能力由 EventService 提供,包括结束会话、请求人工客服和退出排队等操作。
结束会话
public static boolean closeSession(final String exchange, String closeSessionMsg)参数说明
| 字段 | 类型 | 参数说明 | 取值说明 |
|---|---|---|---|
| exchange | String | 聊天对象ID | 标准版:UnicornMessageBuilder.getSessionId()平台版:商户ID |
| closeSessionMsg | String | 提示文案 | 关闭会话的提示文案 |
代码示例
EventService.closeSession(UnicornMessageBuilder.getSessionId(), "结束会话");标准版会话的 exchange 一般传 UnicornMessageBuilder.getSessionId();平台版或多商家会话传当前商家的 shopId。下面涉及 exchange 的接口都遵循这个规则。
请求客服
public static void requestStaff(boolean humanOnly, RequestStaffCallback callback)
public static void requestStaff(String exchange, boolean humanOnly, long staffId, long groupId, int requestStaffScenes, RequestStaffCallback callback)
public static void requestStaff(String exchange, boolean humanOnly, long staffId, long groupId, int requestStaffScenes, boolean isEnableVideo, RequestStaffCallback callback)参数说明
| 字段 | 类型 | 参数说明 | 取值说明 |
|---|---|---|---|
| exchange | String | 聊天对象ID | 标准版:UnicornMessageBuilder.getSessionId()平台版:商户ID |
| humanOnly | boolean | 是否只请求人工客服 | true:只请求人工客服false:人工客服和机器人都可以 |
| staffId | long | 客服ID | 查询路径:管理端-服务中心-在线系统-设置-会话流程-会话分配-自定义链接分配-ID查询-客服及客服组ID查询 |
| groupId | long | 分组ID | 查询路径:管理端-服务中心-在线系统-设置-会话流程-会话分配-自定义链接分配-ID查询-客服及客服组ID查询 |
| requestStaffScenes | int | 请求客服场景 | 客户自定义 |
| isEnableVideo | boolean | 是否开启视频客服 | 接入视频客服SDK,想要开启视频客服,把该字段设置为true |
| callback | RequestStaffCallback | 请求客服回调 | 客服回调 |
RequestStaffCallback
| 接口回调函数 | 说明 |
|---|---|
| OnMessageItemClickListener | 需要实现两个接口: 成功onSuccess, 失败 onFailed |
代码示例
EventService.requestStaff(false, new RequestStaffCallback() {
@Override
public void onSuccess() {
// 请求客服成功
}
@Override
public void onFailed(int errorCode) {
}
});如果 App 在会话中根据当前业务场景主动转人工,例如用户点击“联系售后”,可以传入客服组或客服 ID。只指定客服组时,SDK 会在该组内分配客服;同时传 staffId 和 groupId 时,staffId 优先。
String exchange = UnicornMessageBuilder.getSessionId();
long groupId = 123456L;
long staffId = 0L;
EventService.requestStaff(exchange, true, staffId, groupId, RequestConstant.SCENES_NORMAL,
new RequestStaffCallback() {
@Override
public void onSuccess() {
// 请求人工客服成功
}
@Override
public void onFailed(int errorCode) {
// 根据 errorCode 处理失败场景
}
});平台版会话中,exchange 传当前商家的 shopId。
String exchange = shopId;
EventService.requestStaff(exchange, true, 0L, groupId, RequestConstant.SCENES_NORMAL, callback);转接客服
public static void transferStaff(String exchange, long staffId, long groupId, String closeSessionMsg, boolean isHuman, TransferCloseResultCallback transferCloseResultCallback, TransferRequestCallback transferRequestCallback)参数说明
| 字段 | 类型 | 参数说明 | 取值说明 |
|---|---|---|---|
| exchange | String | 聊天对象ID | 标准版:UnicornMessageBuilder.getSessionId()平台版:商户ID |
| staffId | long | 客服ID | 查询路径:管理端-服务中心-在线系统-设置-会话流程-会话分配-自定义链接分配-ID查询-客服及客服组ID查询 |
| groupId | long | 分组ID | 查询路径:管理端-服务中心-在线系统-设置-会话流程-会话分配-自定义链接分配-ID查询-客服及客服组ID查询 |
| closeSessionMsg | String | 提示文案 | 关闭会话的提示文案 |
| isHuman | boolean | 是否只请求人工客服 | true:只请求人工客服false:人工客服和机器人都可以 |
| transferCloseResultCallback | TransferCloseResultCallback | 转接客服中的关闭客服事件的回调 | 关闭客服回调 |
| transferRequestCallback | TransferRequestCallback | 转接客服中的请求客服事件的回调 | 请求客服回调 |
TransferCloseResultCallback
| 接口回调函数 | 说明 |
|---|---|
| TransferCloseResultCallback | 需要实现handlerTransferCloseCallback接口 |
TransferRequestCallback
| 接口回调函数 | 说明 |
|---|---|
| TransferRequestCallback | 需要实现handlerTransferRequestCallback接口 |
退出排队
public static boolean quitQueue(final String exchange)参数说明
| 字段 | 类型 | 参数说明 | 取值说明 |
|---|---|---|---|
| exchange | String | 聊天对象ID | 标准版:UnicornMessageBuilder.getSessionId()平台版:商户ID |
代码示例
EventService.quitQueue(UnicornMessageBuilder.getSessionId());请求客服事件
当在请求客服前,会拦截请求客服事件。
| 请求客服结果code | 类型 | 说明 |
|---|---|---|
| 201 | int | 没有客服 |
| 202 | int | 请求失败 |
| 203 | int | 排队中 |
| 204 | int | 长连接失效 |
| 205 | int | 没有客服在线,留言关闭 |
代码示例
public class DemoRequestStaffEvent implements UnicornEventBase<RequestStaffEntry> {
/**
* 当事件发生的时候,会回调这个方法,在这个方法中,事件是处于等待的状态的只有调用了
* callback 中的方法,事件才会继续
*
* @param entry 请求客服事件的一些参数
* @param context 当前界面的 context 对象,使用之前请判断是否为 null
* @param callback sdk 的回调对象 具体请查看 EventCallback
*/
@Override
public void onEvent(final RequestStaffEntry entry, Context context, final EventCallback<RequestStaffEntry> callback) {
if (context == null) {
Toast.makeText(context, "请求客服的信息为:" + entry.toString(), Toast.LENGTH_LONG).show();
} else {
//当处理成功之后可以调用 onProcessEventSuccess 通知 sdk 可以请求客服了
AlertDialog dialog = new AlertDialog.Builder(context).setMessage("请求客服的信息为" + entry.toString() + "是否拦截")
.setPositiveButton("是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
callback.onInterceptEvent();
//以下是示例调用EventService.requestStaff的方法,用户在这里可以走自己的逻辑
//在这里将拦截器置为null,否则会死循环
DemoCache.ysfOptions.sdkEvents = null;
//拦截掉,自己发起请求
EventService.requestStaff(true, new RequestStaffCallback() {
@Override
public void onSuccess() {
Toast.makeText(context, "请求成功", Toast.LENGTH_LONG).show();
}
@Override
public void onFailed(int errorCode) {
/**
* 请求客服失败回调
*
* @param errorCode 201:没有客服
* 202:其它错误
* 203:需要排队
* 204:长连接失效
* 205:没有客服在线,留言关闭
* -1: 数据返回错误
* -2: 正在请求客服
*/
Toast.makeText(context, "请求失败:" + errorCode, Toast.LENGTH_LONG).show();
}
});
}
})
.setNegativeButton("否", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//不拦截,直接请求客服
callback.onNotPorcessEvent();
}
}).create();
dialog.show();
}
}
}未读消息
本节说明未读消息数的获取、监听和清理方式。
未读消息数变化监听
通过 Unicorn.addUnreadCountChangeListener() 注册 UnreadCountChangeListener 后,新消息到达时会触发未读数变化回调。
public static void addUnreadCountChangeListener(UnreadCountChangeListener listener, final boolean add)参数说明
| 字段 | 类型 | 参数说明 | 取值说明 |
|---|---|---|---|
| listener | UnreadCountChangeListener | 消息未读数有变更时的通知 | 接口回调函数 |
| add | boolean | 添加或注销监听 | true:添加监听false:注销监听 |
UnreadCountChangeListener
| 接口回调函数 | 说明 |
|---|---|
| UnreadCountChangeListener | 需要实现onUnreadCountChange接口 |
代码示例
private UnreadCountChangeListener mUnreadCountListener = new UnreadCountChangeListener() {
@Override
public void onUnreadCountChange(int count) {
updateUnreadCount(count);
if (count > 0) {
IMMessage message = Unicorn.queryLastMessage();
if (message != null) {
Log.d("queryLastMessage", "getFromAccount: " + message.getFromAccount());
// 获取消息附件
if (message.getAttachment() != null) {
if (message.getAttachment() instanceof YsfAttachment) {
Log.d("queryLastMessage", "message:" + ((YsfAttachment) message.getAttachment()).getContent());
} else {
Log.d("queryLastMessage", "message:" + message.getAttachStr());
}
} else {
// 获取文本消息
Log.d("queryLastMessage", "message:" + message.getContent());
}
}
}
}
};
Unicorn.addUnreadCountChangeListener(mUnreadCountListener, true)获取未读的消息数
public static int getUnreadCount()代码示例
// 获取未读消息数
int unreadCount = Unicorn.getUnreadCount();清理未读数
标准版和平台版会话的未读数均由 POPManager 管理。
public static void clearUnreadCount(String shopId)参数说明
| 字段 | 类型 | 参数说明 | 取值说明 |
|---|---|---|---|
| shopId | String | 聊天对象ID | 标准版:UnicornMessageBuilder.getSessionId()平台版:商户ID |
代码示例
POPManager.clearUnreadCount(UnicornMessageBuilder.getSessionId());清理商家未读数
public static void clearUnreadCount(String shopId)参数说明
| 字段 | 类型 | 参数说明 | 取值说明 |
|---|---|---|---|
| shopId | String | 聊天对象ID | 商户ID |
代码示例
POPManager.clearUnreadCount(shopId);消息接收与最后一条消息
本节说明如何监听新消息以及获取最后一条消息内容。
获取最后一条消息内容
可用于未读消息变化时,展示最后一条未读消息,或者展示客服的最后一条消息
public static IMMessage queryLastMessage()代码示例
IMMessage message = Unicorn.queryLastMessage();
if (message != null) {
// 获取消息附件
if (message.getAttachment() != null) {
if (message.getAttachment() instanceof YsfAttachment) {
Log.d("queryLastMessage", "message:" + ((YsfAttachment) message.getAttachment()).getContent());
} else {
Log.d("queryLastMessage", "message:" + message.getAttachStr());
}
} else {
// 获取文本消息
Log.d("queryLastMessage", "message:" +message.getContent());
}
}历史消息与漫游
本节说明历史消息加载、收起和服务端漫游消息拉取相关能力。
拉取漫游消息
当切换账户的时候,是否从服务端拉取消息,开启之后会从服务端拉取用户最近聊天的 20 条内容加入消息流。
七鱼客服系统支持账号信息打通,对于企业通过setUserInfo接口传入的userId,服务端会合并不同访客端产生的消息记录。SDK 默认不从服务端拉取漫游消息,仅读取本地数据库持久化数据。若开启漫游消息拉取功能,则在企业调用setUserInfo:时会联网请求该userId账户对应的漫游历史消息,并与本地数据库进行对比过滤重复数据。
| 参数名 | 类型 | 参数说明 | 取值说明 |
|---|---|---|---|
| isPullMessageFromServer | boolean | 是否开启漫游消息 | 默认为false,表示不开启 |
| pullMessageCount | int | 从服务端拉取历史消息的数量 | 当 isPullMessageFromServer = true 时生效,默认 20 条最大 100 条 |
是否加载历史消息
在一通会话开始的时候是否加载历史消息
| 参数名 | 类型 | 参数说明 | 取值说明 |
|---|---|---|---|
| isDefaultLoadMsg | boolean | 进入客服界面加载历史消息 | 默认为 true |
满意度评价
本节说明评价界面、评价结果上报和会话结束时邀评等能力。
打开评价界面
打开评价界面,如果自定义了评价界面会跳转自定义的评价界面,如果没有自定义,则进行七鱼评价界面的流程
public static void openEvaluation(final Activity activity, final String exchange, final RequestCallbackWrapper callbackWrapper)参数说明
| 字段 | 类型 | 参数说明 | 取值说明 |
|---|---|---|---|
| activity | Activity | Android的Activity | 调用该方法的Activity |
| exchange | String | 聊天对象ID | 标准版:UnicornMessageBuilder.getSessionId()平台版:商户ID |
| callbackWrapper | RequestCallbackWrapper | 评价回调 | 评价回调 |
RequestCallbackWrapper
| 接口回调函数 | 说明 |
|---|---|
| RequestCallbackWrapper | 需要实现 onResult。封装了成功、失败和异常三个接口,在参数上进行区分 |
取消评价
public static void cancelEvaluation(String exchange)参数说明
| 字段 | 类型 | 参数说明 | 取值说明 |
|---|---|---|---|
| exchange | String | 聊天对象ID | 标准版:UnicornMessageBuilder.getSessionId()平台版:商户ID |
自定义评价界面
SDK 通过 EvaluationApi 开放自定义评价界面能力:用户点击评价或客服邀请评价时,SDK 将评价事件交给 App 处理,App 完成处理后再调用 SDK 接口回传评价结果。
下面是接口定义:
public class EvaluationApi {
private OnEvaluationEventListener onEvaluationEventListener;
/**
* 评价事件监听类,用户可以通过调用 setOnEvaluationEventListener
* 方法去设置自己实现的 OnEvaluationEventListener ,当用户设置了 OnEvaluationEventListener
* 那么当用户触发了评价事件就会交给 App 方处理
*/
public static abstract class OnEvaluationEventListener {
/**
* 评价状态改变
*
* @param state 0:不可评价,1:可评价,2:评价完成
*/
public void onEvaluationStateChange(int state) {
}
/**
* 邀评消息被点击,App 方可以在此方法启动自己的评价界面
* @param entry 评价的相关数据
*/
public void onEvaluationMessageClick(EvaluationOpenEntry entry, Context context) {
}
}
private static class SingletonHolder {
private static final EvaluationApi sInstance = new EvaluationApi();
}
public static EvaluationApi getInstance() {
return SingletonHolder.sInstance;
}
public OnEvaluationEventListener getOnEvaluationEventListener() {
return onEvaluationEventListener;
}
public void setOnEvaluationEventListener(OnEvaluationEventListener onEvaluationEventListener) {
this.onEvaluationEventListener = onEvaluationEventListener;
}
/**
* 评价
*
* @param shopCode 商家ID, 在 EvaluationOpenEntry 里面有这个值,只需要回传就可以了
* @param sessionId 会话 ID ,在 EvaluationOpenEntry 里面有这个值,只需要回传就可以了
* @param score 评分
* @param remark 评价内容
* @param tagList 标签
* @param name 评价结果的文案,例如非常满意、满意、不满意等
* @param callback 回调
*/
public void evaluate(String shopCode, long sessionId, int score, String remark, List<String> tagList, String name, RequestCallbackWrapper<String> callback) {
SessionManager.getInstance().getEvaluationManager().doEvaluate(shopCode, sessionId, score, remark, tagList, name, callback);
}
}当需要自定义评价界面的时候,App 首先需要实现一个自己的 OnEvaluationEventListener ,然后把实现的 OnEvaluationEventListener 赋值给 EvaluationApi 中的 onEvaluationEventListener 变量,例如如下代码:
EvaluationApi.getInstance().setOnEvaluationEventListener(new EvaluationApi.OnEvaluationEventListener() {
@Override
public void onEvaluationStateChange(int state) {
//当评价状态改变的时候,会调用该方法,所以当有需求的时候可以在改方法中做一些操作
}
@Override
public void onEvaluationMessageClick(EvaluationOpenEntry entry, Context context) {
if (context == null)
return;
Intent intent = new Intent(context, DemoEvaluationActivity.class);
intent.putExtra(ENTRYTAG, entry);
context.startActivity(intent);
}
});从上面的代码中看到,当调用 onEvaluationMessageClick 方法的时候我们跳转到了 DemoEvaluationActivity(也就是我们自定义的评价界面),然后把评价里面的数据给到了DemoEvaluationActivity,这样就可以在 DemoEvaluationActivity 展示评价的数据了。
如果想要查看评价里面的数据具体如何使用,请参考 Demo 工程中的 DemoEvaluationActivity 类。
多语言设置
本节说明 SDK 多语言能力和语言环境设置方式。
多语言设置
SDK 增加了对多语言的支持,在进入聊天界面时会上报系统的语言设置。 如设置的语言种类不在七鱼支持的范围内,则默认为英文。
目前支持简体中文、繁体中文、英语、德语、法语、印尼语、日语、韩语、泰语、菲律宾语、越南语、土耳其语、西班牙、语葡萄牙语、俄语、阿拉伯语。
代码示例
Unicorn.setLocalLanguage(String language, String area)参数说明
| 语言 | language | area |
|---|---|---|
| 简体中文 | zh | CN |
| 繁体中文 | zh | TW |
| 英语 | en | US |
| 德语 | de | "" |
| 法语 | fr | "" |
| 印尼语 | in | "ID" |
| 日语 | ja | "" |
| 韩语 | ko | "" |
| 泰语 | th | "" |
| 菲律宾语 | fil | "" |
| 越南语 | vi | "" |
| 土耳其语 | tr | "" |
| 西班牙语 | es | "" |
| 葡萄牙语 | pt | "" |
| 俄语 | ru | "" |
| 阿拉伯语 | ar | "" |
缓存管理
本节说明 SDK 文件缓存或账号缓存的清理方式。
清除文件缓存
将删除SDK接收过的所有文件,建议在工作线程中执行该操作
public static void clearCache()代码示例
Unicorn.clearCache();网络路由诊断
从 Android SDK 11.7.0 开始,Diagnosis 提供 TraceRoute 诊断接口,供开发者在 SDK 集成或网络连接异常时验证目标域名的路由信息及 TraceRoute 原生库是否可用。该接口用于排障,不建议作为正常业务请求的连通性判断。
// 异步执行,结果通过工作线程回调
public static void traceRoute(String hostname, Diagnosis.TraceRouteCallback callback)
// 同步执行,会阻塞当前线程
public static Diagnosis.TraceRouteResult traceRoute(String hostname)同步重载需要在工作线程调用。异步重载会自行创建工作线程,onComplete 也在该工作线程回调;如需更新界面,请切换到主线程。
TraceRouteResult 提供以下结果方法:
| 方法 | 说明 |
|---|---|
| isSuccess() | code == 0 且没有异常时返回 true |
| getCode() | 获取诊断结果码 |
| getMessage() | 获取路由诊断结果或错误说明 |
| getThrowable() | 获取执行期间捕获的异常;无异常时为 null |
Diagnosis.traceRoute("www.example.com", new Diagnosis.TraceRouteCallback() {
@Override
public void onComplete(Diagnosis.TraceRouteResult result) {
Log.i("QiyuDiagnosis", "code=" + result.getCode()
+ ", message=" + result.getMessage());
}
});这篇文档有帮助吗?