本文档分两个版本
-
1.客服IMSDK开发指南(Android)
概述
云客服平台访客端Android SDK,可由对接企业移动端开发人员通过集成开发实现App内访客端的接入。
我们提供了较为完善的Demo以及Demo ui代码。对接之前,对接企业的负责人或已开通坐席平台的管理员可以下载Demo提供给研发进行运行体验,提前了解SDK能力便于更快速的进行SDK集成和开发工作。
Demo ui提供了一套基础的会话样式示例,如不满足您的样式需求需要您对Demo ui样式进行自定义修改,请详细阅读并了解Demo代码后进行自定义ui。
一、sdk工作流程
二、sdk下载文件说明
1、sdk文件包含内容:
- 对接说明文档
- 运行实例 demo
2、sdk运行环境及使用依赖库:
Android minSdkVersion:16
依赖库说明: com.qiniu:qiniu-android-sdk:7.4.6 七牛文件存储sdk org.greenrobot:eventbus:3.2.0 eventbus com.google.code.gson:gson:2.8.5 gson com.github.bumptech.glide:glide:4.9.0 glide图片加载 com.effective.android:panelSwitchHelper:1.3.13 软键盘适配 com.google.android:flexbox:1.0.0 伸缩布局 com.moor.imkf:moor_visitorIm_sdk sdk
3、accessId获取方法
登录坐席pc网站,点击左侧最下面的设置,选择左侧面板中的渠道设置,选择移动客服APP,点击添加按钮,即可创建一个应用的接入号。在创建好的应用点击配置说明可查看对应的accessId,用此ID即可初始化客服SDK。
4、运行KEFUDEMO项目:
- 该项目为android studio 项目,请用android studio进行打开
- 项目打开之后填写参数后可直接运行(参数修改文件为MainActivity);
helper.initSdkChat("请填写后台获取的accessId", "hhtest", "userId");
(填写获取的accessId后可直接运行demo,查看效果)
提醒:accessId + userId +设备号 是访客的唯一标识。
三、开始集成
1、将所提供demo 中的 imkf 当作一个module引入到自己的项目中
具体步骤
1:使用Android studio导入Module
2:在窗口中选择到 ykfsdk的 modlue中,进行下一步导入。
3:在自己项目app目录下的build.gradle中增加:
api project(path: ':ykfsdk')
4:重新 build你的项目。
备注:
- 如果没有特定场景需求,本demo示例基本满足大部分需求,用户将demo导入自己项目后,输入accessid后并确认环境就可完成配置。
- 特别注意(NewMsgReceiver 这个类的路径必须是 com.m7.imkfsdk.receiver,否则会导致无法及时收到消息) 注意:sdk初始化可以直接参考demo中MainActivity的代码。
先申请权限 android 版本>=6.0 代码也在MainActivity
/**
* 第一步:初始化help 文件
*/
final KfStartHelper helper = KfStartHelper.getInstance(this);
//点击跳转在线咨询的按钮(换成自己按钮监听)
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
helper.initSdkChat("fa0f5110-82ec-11e7-8ca1-8b4900b05172", "测试2","97289000");
}
});
- 如果有关于头像、商品链接、扩展信息字段请参考本文章中的延伸功能
- 以下接口说明是针对特殊场景开发以及向开发人员说明接口功能
2、接口说明(适应于自定义场景)
初始化SDK
1:首先创建 KfStartHelper 对象 KfStartHelper helper = KfStartHelper.getInstance(_this); 2:调用配置要使用的服务环境 目前提供两种方法进行配置: 1:RequestUrl._setRequestBasic(); 腾讯云,阿里云用户只使用setRequestBasic即可 RequestUrl.ALIYUN_REQUEST;//阿里云环境 RequestUrl.Tencent_REQUEST;//腾讯云环境 2: RequestUrl.setRequestUrl();注意:此方法仅适用于私有云环境
RequestUrl.setRequestUrl()
(int tcpPort, String tcpHost, String http1, String http2,String wsAddress)
参数说明:tcpPort:tcp使用的端口号
tcpHost:tcp使用的服务地址
http1,http2:使用的Http服务
wsAddress:使用到的websocket 域名和端口号例如:117.15.85.141:7073,
如不需要使用传空字符串即可。
_ 注意:setRequestBasic与setRequestUrl为二选一调用 , 腾讯云阿里云只使用setRequestBasic即可,私有云用户只使用setRequestUrl即可。 3: _RequestUrl.setFileUrl();配置私有云文件服务器 注意:此方法仅适用于私有云环境
/* 要在helper.initSdkChat()之前设置
* fileHttp"完整的服务地址",
* fileDomains:{"只需填写中间域名以及端口部分"},
* isHttps:是否为https
*/
RequestUrl.setFileUrl( "https://im-fileserver:8000/",
new String[]{"im-fileserver:8000"},true)
3:初始化SDK
helper.initSdkChat("", "", "");
其中参数说明: String accessId, 接入号,必填项. String username, 用户名,用来在后台显示. String userId, 用户id,用来标识用户.
SDK初始化的接口监听
MChatManager.getInstance().setOnInitListener(new InitListener() {
@Override
public void oninitSuccess() {
LogUtil.d("MobileApplication", "sdk初始化成功");
}
@Override
public void onInitFailed(int code) {
LogUtil.d("MobileApplication", "sdk初始化失败");
}
});
注意:该回调接口只是用来判断SDK是否初始化成功了,注意:只有成功了之后才可以使用IM相关功能,该返回接口是在主线程中,可以直接操作UI
开启使用前台服务
默认开启使用前台服务,使用前台服务可以提高连接的稳定性,推荐开启。 如果不需要使用前台服务则可调用配置
//配置是否使用前台服务,默认true 使用前台服务,false则使用后台服务
helper.setUSE_ForegroundService();
注意:需要在initSdkChat()方法之前调用。
获取配置日程管理接口.
开始会话前先得获取是否配置日程,代码如下: 具体使用详见demo
IMChatManager.getInstance().getWebchatScheduleConfig(InfoDao.getInstance().getConnectionId(), new GetGlobleConfigListen() {
@Override
public void getSchedule(ScheduleConfig sc) {
}
@Override
public void getPeers() {
}
});
获取技能组接口
开始会话前先得获取后台配置的技能组,代码如下:
IMChatManager.getInstance().getPeers(new GetPeersListener() {
@Override
public void onSuccess(List<Peer> peers) {
}
@Override
public void onFailed() {
}
});
onSuccess接口中返回的即是技能组的数据列表
会话开始接口
当开始一次新会话时,需请求该接口通知服务器,并将需要联系的技能组id传进来,代码如下:
IMChatManager.getInstance().beginSession(peerId, new OnSessionBeginListener() {
@Override
public void onSuccess() {
}
@Override
public void onFailed() {
}
});
该接口的回调中 onSuccess表示会话开始成功了 onFailed表示接口请求失败,具体请参考提供的demo。
广播接收器
调用过该接口后,需在聊天界面中注册广播来接收当前是机器人还是人工客服的状态,进行界面的相应变化。广播接收器代码如下:
class KeFuStatusReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(IMChatManager.ROBOT_ACTION.equals(action)) {
//当前是机器人
handler.sendEmptyMessage(0x111);
}else if(IMChatManager.ONLINE_ACTION.equals(action)) {
//当前客服在线
handler.sendEmptyMessage(0x222);
} else if(IMChatManager.OFFLINE_ACTION.equals(action)) {
//当前客服不在线
handler.sendEmptyMessage(0x333);
}
}
}
具体请参看demo;
获取后台满意度是否开启
获取后台满意度是否开启的配置 在调用完beginSession成功后,可以通过.
IMChatManager.getInstance().isInvestigateOn()
方法来获取满意度评价是否开启,来隐藏或显示评价按钮。
转人工客服
当服务器配置了机器人聊天后,通过转人工接口可以与人工客服进行聊天,代码如下:
IMChatManager.getInstance().convertManual(new OnConvertManualListener() {
@Override
public void onLine() {
//有客服在线,隐藏转人工按钮
Toast.makeText(ChatActivity.this, "转人工服务成功", Toast.LENGTH_SHORT).show();
}
@Override
public void offLine() {
//当前没有客服在线,弹出离线留言框
}
});
成功之后,则可以与人工客服进行聊天。
提交离线留言
当客服不在线时,可以提交离线留言,代码如下:
IMChatManager.getInstance().submitOfflineMessage(peerId, content, phone, email, new OnSubmitOfflineMessageListener() {
@Override
public void onSuccess() {
dismiss();
Toast.makeText(getActivity(), "提交留言成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed() {
dismiss();
Toast.makeText(getActivity(), "提交留言失败", Toast.LENGTH_SHORT).show();
}
});
提交离线留言中参数peerId为技能组的id, content为留言内容,phone是电话,email是邮箱。
消息实体
界面显示时会用到消息的一些属性进行不同的显示,下面将消息中的具体属性展示如下: 消息实体类为FromToMessage.
属性 | 说明 |
---|---|
userType | 用户发送消息的类型:发送的消息为”0”,接收的消息为”1” |
msgType | 消息类型:目前有4种,分别为文本消息,录音消息,图片消息, 知识库文本 |
when | 消息发送或接收的时间 |
message | 消息的文本内容 |
sendState | 消息发送的状态 |
recordTime | 若为录音消息,表示录音时长 |
filePath | 录音文件或图片文件在本地的路径 |
更多详细请查看demo
拼装一条消息
- 文本消息:
使用如下代码
FromToMessage fromToMessage = IMMessage.createTxtMessage(txt);
参数说明: String txt, 消息文本内容.
- 录音消息:
使用如下代码.
FromToMessage fromToMessage = IMMessage.createAudioMessage(mTime, filePath);
参数说明: float mTime, 录音时长 String filePath, 录音在本地的路径
- 图片消息:
使用如下代码
FromToMessage fromToMessage = IMMessage.createImageMessage(picFileFullName);
参数说明: String picFileFullName, 图片在本地的路径
- 文件消息:
FromToMessage fromToMessage = IMMessage.createFileMessage(path, fileName, fileSizeStr);
参数说明: String path, 文件在本地的路径 String fileName, 文件名字 String fileSizeStr, 文件大小 拼装好的消息在发送时用到。
发送消息
使用如下代码:
IMChat.getInstance().sendMessage(fromToMessage, new ChatListener() {
@Override
public void onSuccess() {
}
@Override
public void onFailed() {
}
@Override
public void onProgress() {
}
});
参数说明: FromToMessage fromToMessage, 要发送的消息 ChatListener ,消息发送的接口监听,发送成功,失败或正在发送,该回调接口中可以直接进行界面的操作。发送的消息存到了本地数据库中,具体可参看提供的demo
录制MP3格式语音
由于跨平台的需要,发送的录音文件格式需为mp3格式,因此提供了录制mp3格式的方法,代码如下:
MP3Recorder mp3Recorder = new MP3Recorder(file);//初始化录音器
mp3Recorder.start();//开始录制
mp3Recorder.stop();//结束录制
其中的参数为:File file录音保存文件,具体使用可参看提供的demo
重发消息
当有时候发送失败后,需重新发送该条消息,代码如下:
IMChat.getInstance().reSendMessage(fromToMessage, new ChatListener() {
@Override
public void onSuccess() {
}
@Override
public void onFailed() {
}
@Override
public void onProgress() {
}
});
接收新消息
需通过注册广播来获取新消息,首先需要一个全局注册的广播,在AndroidManifest.xml中代码为:
<receiver
android:name="com.m7.imkfsdk.receiver.NewMsgReceiver"
android:enabled="true"
>
<intent-filter android:priority="2147483647" >
<!—修改此action为自己定义的,该action必须和SDK初始化接口中所填的一样,举例如下-->
<action android:name=“com.m7.demo.action” />
</intent-filter>
</receiver>
请先修改此action的值,和SDK初始化时传入的值必须相同,否则接收不到新消息的广播,注意当接收到该广播后,消息已经保存到了本地的数据库中了。具体请查看demo。
获取数据库中的消息
在界面上显示消息就得先从数据库中获得消息数据,代码如下:
List<FromToMessage>fromToMessages=IMChatManager.getInstance().getMessages(1);
参数中的数字为取第几页的数据,用于下拉加载更多消息时使用,默认是一页15条消息数据。这样就获取到了数据库中的消息了,之后就可以在界面进行显示操作了。具体参考demo中。
更新一条消息数据到数据库中
若需要将消息的数据修改后保存到数据库中,代码如下:
IMChatManager.getInstance().updateMessageToDB(message);
参数为FromToMessage message,修改数据后的消息。
判断数据库中数据是否都取出
界面显示时需要判断本地数据库中的数据是否已经被全部取出,代码如下:
IMChatManager.getInstance().isReachEndMessage(size);
获取评价列表数据
获取后台配置的评价列表数据,代码如下:
List<Investigate> investigates = IMChatManager.getInstance().getInvestigate();
返回的结果结果为:List investigates,即为评价实体的列表,Investigate中的name属性为该评价的名称,可用来显示在界面上。
提交评价结果
代码如下:
IMChatManager.getInstance().submitInvestigate(investigate, new SubmitInvestigateListener() {
@Override
public void onSuccess() {
Toast.makeText(InvestigateActivity.this, "评价提交成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed() {
Toast.makeText(InvestigateActivity.this, "评价提交失败",Toast.LENGTH_SHORT).show();
}
});
参数为: Investigate investigate 评价实体 SubmitInvestigateListener 提交评价回调接口 注:该接口只有在与人工客服聊天过后评价才有意义。
客服主动发起的评价
客服在服务完用户后也可以主动发起评价的请求,用户端需要作出相应的响应,用户端在聊天界面注册相应的广播,接收到相应的事件会生成一个评价的消息,点击完评价之后该消息会被删除,生成评价消息的代码如下:
private void sendInvestigate() {
ArrayList<Investigate> investigates = (ArrayList<Investigate>) IMChatManager.getInstance().getInvestigate();
IMMessage.createInvestigateMessage(investigates);
updateMessage();
}
工号、姓名、头像推送
在接入聊天会话后,会把客服人员的工号、姓名和头像信息推送回来。聊天界面中通过接收IMChatManager.USERINFO_ACTION的广播来获取对应数据。
访客无响应断开对话时长配置获取
通过GlobalSet globalSet = GlobalSetDao.getInstance().getGlobalSet();来获取配置信息,里面的break_len代表断开对话时长,break_tips_len代表断开前提示时长,break_tips代表提示内容。
关闭SDK
若需关闭sdk 会话页面,则可以调用该接口,代码如下:
IMChatManager.getInstance().quitSDk();
注意:只是关闭访客这边sdk的会话页面,坐席侧会话依然存在,并不是关闭会话方法
设置IP地址(私有云用户)
若需设置自己服务器的地址(在初始化init()之前调用以下方法),代码如下:
RequestUrl.setRequestUrl()
(int tcpPort, String tcpHost, String http1, String http2,String wsAddress)
参数说明:tcpPort:tcp使用的端口号
tcpHost:tcp使用的服务地址
http1,http2:使用的Http服务
wsAddress:使用到的websocket 域名和端口号例如:117.15.85.141:7073,
如不需要使用传空字符串即可。
开启关闭log打印
sdk中包含帮助开发人员开发的数据log,上线时可根据需求开关,代码如下:
KfStartHelper helper = new KfStartHelper(MainActivity.this);
//关闭log
helper.closeLog();
//打开log
helper.openLog();
获取sdk版本号
获取当前使用的IMKFSdk版本号
//获取sdk版本号
IMChatManager.getInstance().getSdkVersion();
混淆
因sdk中使用到七牛,eventbus,glide等三方库,以下混淆代码除 ‘KF’ 片段外只针对sdk使用依赖库版本提供混淆示例,更多详细的混淆配置可根据三方依赖库官方文档配置。
注意:shrinkResources设置为false,不然表情显示不正确
混淆代码:
-keepattributes *Annotation*
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keepattributes *DatabaseField*
-keepattributes *DatabaseTable*
-keepattributes *SerializedName*
-keep class **.R$* {*;}
-ignorewarnings
#-------KF------
-dontwarn com.m7.imkfsdk.**
-keep class com.m7.imkfsdk.** { *; }
-dontwarn com.moor.imkf.**
-keep class com.moor.imkf.** { *; }
#软键盘
-dontwarn com.effective.android.panel.**
-keep class com.effective.android.panel.** { *; }
#---------KF------
#七牛
-dontwarn com.qiniu.**
-keep class com.qiniu.**{*;}
-keep class com.qiniu.**{public <init>();}
# OkHttp3
-dontwarn okhttp3.**
-keep class okhttp3.** { *;}
# Okio
-dontwarn com.squareup.**
-dontwarn okio.**
-keep public class org.codehaus.* { *; }
-keep public class java.nio.* { *; }
#GSON
-dontwarn sun.misc.**
-keep class com.google.gson.examples.android.model.** { <fields>; }
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keepclassmembers,allowobfuscation class * {@com.google.gson.annotations.SerializedName <fields>;}
#eventbus
-dontwarn org.greenrobot.eventbus.**
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keepclassmembers class ** {
public void onEvent*(**);
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
#glide
-dontwarn com.bumptech.glide.**
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep class * extends com.bumptech.glide.module.AppGlideModule {
<init>(...);
}
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder {
*** rewind();
}
#OrmLite,sqlcipher
-keep class com.j256.** { *; }
-keep class com.j256.**
-keepclassmembers class com.j256.**
-keep enum com.j256.**
-keepclassmembers enum com.j256.**
-keep interface com.j256.**
-keepclassmembers interface com.j256.**
-dontwarn net.sqlcipher.**
-keep class net.sqlcipher.** {*;}
四、延伸功能
1、如需自定义用户头像和机器人头像
2、设置专属座席功能
sdk v3.8.0提供了配置拓展信息的接口
-
版本号≥3.8.0
在demo 的初始化方法前提供了setOtherParams()示例 如果需要设置 专属坐席 第一个参数传入坐席id 即可
/**
* 添加要使用的 拓展信息内容
* @param agentId 专属坐席id
* @param otherObject: 添加拓展字段的数据
* @param useUserLabels: 是否使用user_labels参数
* @param user_labels: user_labels字段数据
*/
public void setUserOtherParams(String agentId,JSONObject otherObject, boolean useUserLabels, JSONObject user_labels)
- 版本小于3.8.0
调用beginSession的重载方法,可传入json字符串,示例如下,需在 ChatActivity 中对原有的 beginSession 进行修改,不可单独调用
String otherParams = "";
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("agent", "8131");
} catch (JSONException e) {
e.printStackTrace();
}
otherParams = jsonObject.toString();
IMChatManager.getInstance().beginSession(peerId, otherParams, new OnSessionBeginListener() {})
3、设置扩展信息
sdk v3.7.0提供了配置拓展信息接口
-
版本号≥3.7.0
在demo 的初始化方法前提供了setOtherParams()示例
/**
* 添加要使用的 拓展信息内容
* @param agentId 专属坐席id
* @param otherObject: 添加拓展字段的数据
* @param useUserLabels: 是否使用user_labels参数
* @param user_labels: user_labels字段数据
*/
public void setUserOtherParams(String agentId,JSONObject otherObject, boolean useUserLabels, JSONObject user_labels)
在ChatActivity 的beginSession()和beginScheduleSession()方法使用如下方法来获取字段_ String other_Str = IMChatManager._getInstance()_.getUserOtherParams_()_;
2.客服IMSDK开发指南(Android)(4.3.0)
概述
云客服平台访客端Android SDK,可由对接企业移动端开发人员通过集成开发实现App内访客端的接入。
我们提供了较为完善的Demo以及Demo ui代码。对接之前,对接企业的负责人或已开通坐席平台的管理员可以下载Demo提供给研发进行运行体验,提前了解SDK能力便于更快速的进行SDK集成和开发工作。
Demo ui提供了一套基础的会话样式示例,如不满足您的样式需求需要您对Demo ui样式进行自定义修改,请详细阅读并了解Demo代码后进行自定义ui。
二、sdk工作流程
三、sdk说明
1、sdk文件包含内容:
- 对接说明文档
- 示例 demo(AndroidSupport和AndroidX版本)
2、sdk运行环境及使用依赖库:
- minSdkVersion:19(使用视频最低21)
- targetSdkVersion:29
- gradle插件版本:最低 build:gradle:3.0.0
- gradle版本:最低 gradle-4.1
依赖库:
- com.google.android:flexbox:1.0.0
- com.github.bumptech.glide:glide:4.9.0
-| com.moor.imkf:moor_visitorIm_sdk
|- net.zetetic:android-database-sqlcipher:4.0.1
|- com.effective.android:panelSwitchHelper:1.3.13
|- com.github.xxxx-tech:xxxx_baseLib_sdk
|-org.greenrobot:eventbus:3.2.0
|-com.google.code.gson:gson:2.8.5
|-com.qiniu:qiniu-android-sdk:8.4.0
|-com.j256.ormlite:ormlite-core:5.1
|-com.j256.ormlite:ormlite-android:5.1
3、accessId获取方法
登录坐席pc网站,点击左侧最下面的设置,选择左侧面板中的渠道设置,选择移动客服APP,点击添加按钮,即可创建一个应用的接入号。在创建好的应用点击配置说明可查看对应的accessId,用此ID即可初始化客服SDK。
4、运行KEFUDEMO项目:
- 该项目为android studio 项目,请用android studio进行打开
- 项目打开之后填写参数后可直接运行(参数修改文件为MainActivity);
helper.initSdkChat("请填写后台获取的accessId", "访客昵称", "访客Id");
(填写获取的accessId后可直接运行demo,查看效果)
提醒:accessId + userId +设备号 是访客的唯一标识,尽量保证userId的唯一性
四、开始集成
1、无自定义需求-导入依赖
如果demo提供的ui样式能够满足需求,并且无需对ui以及页面逻辑进行任何改动,可以直接在项目中添加依赖: 1:Android Support项目 api 'com.github.xxxx-tech:xxxx_visitorIm_sdkUi' 2:Android X 项目 api 'com.github.xxxx-tech:xxxx_visitorIm_sdkUiAx'
依赖版本号具体可以参考下载压缩包中的 kfsdk_moudle_AAR项目,使用其配套的远程版本号。
2、自定义UI以及页面自定义调整-导入ykfsdk Moudle形式
具体步骤
1:使用Android studio导入Module
2:在窗口中选择到 ykfsdk的 modlue中,进行下一步导入。
3:在自己项目app目录下的build.gradle中增加:
api project(path: ':ykfsdk')
4:重新 build你的项目。
3、使用音视频功能
如果需求上需要使用到音视频功能,那么在完成以上依赖导入后再添加如下依赖并完成相关代码: 音视频仓库:https://github.com/xxxx-tech/video-call-sdk/releases 1:视频依赖库:api 'com.github.xxxx-tech:sdk_video_jitsi:1.0.5' 2:项目根目录添加仓库:
allprojects {
repositories {
......
maven { url "https://raw.githubusercontents.com/xxxx-tech/video-call-sdk/master" }
......
}
}
3:使用音视频功能项目必须为Androidx 项目,不支持Android support项目。 4:使用音视频功能项目的minSdkVersion 最低为 21。 5:对app gradle开启java8支持 。
android {
........
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
.......
}
6:音视频sdk 混淆规则处理,详细请查看文档中的"混淆配置"部分。
4、备注
- 如果没有特定场景需求,本demo示例基本满足大部分需求,用户将demo导入自己项目后,完成相关的初始化配置,输入accessid后并确认环境就可完成配置。
- 特别注意(NewMsgReceiver 这个类的路径必须是 com.m7.imkfsdk.receiver,否则会导致无法及时收到消息)。 注意:sdk初始化可以直接参考demo中DemoApp,MainActivity的代码。
- 如果有关于头像、商品链接、扩展信息字段请参考本文章中的延伸功能。
- 以下接口说明是针对特殊场景开发以及向开发人员说明接口功能。
- 音视频SDK 遇到video-call-sdk依赖无法下载或下载困难,请查看网络是否可以正常访问github,可以上网获取github host修改方案调整电脑的网络配置。
五、sdk使用说明
初始化SDK
1:在项目Application的onCreate中添加 YKFUtils._init(_this)_;
可参考demo中的DemoApp
具体请参看demo;
获取后台满意度是否开启
获取后台满意度是否开启的配置 在调用完beginSession成功后,可以通过.
IMChatManager.getInstance().isInvestigateOn()
方法来获取满意度评价是否开启,来隐藏或显示评价按钮。
转人工客服
当服务器配置了机器人聊天后,通过转人工接口可以与人工客服进行聊天,代码如下:
IMChatManager.getInstance().convertManual(new OnConvertManualListener() {
@Override
public void onLine() {
//有客服在线,隐藏转人工按钮
Toast.makeText(ChatActivity.this, "转人工服务成功", Toast.LENGTH_SHORT).show();
}
@Override
public void offLine() {
//当前没有客服在线,弹出离线留言框
}
});
成功之后,则可以与人工客服进行聊天。
提交离线留言
当客服不在线时,可以提交离线留言,代码如下:
IMChatManager.getInstance().submitOfflineMessage(peerId, content, phone, email, new OnSubmitOfflineMessageListener() {
@Override
public void onSuccess() {
dismiss();
Toast.makeText(getActivity(), "提交留言成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed() {
dismiss();
Toast.makeText(getActivity(), "提交留言失败", Toast.LENGTH_SHORT).show();
}
});
提交离线留言中参数peerId为技能组的id, content为留言内容,phone是电话,email是邮箱。
消息实体
界面显示时会用到消息的一些属性进行不同的显示,下面将消息中的具体属性展示如下: 消息实体类为FromToMessage.
属性 | 说明 |
---|---|
userType | 用户发送消息的类型:发送的消息为”0”,接收的消息为”1” |
msgType | 消息类型:目前有4种,分别为文本消息,录音消息,图片消息, 知识库文本 |
when | 消息发送或接收的时间 |
message | 消息的文本内容 |
sendState | 消息发送的状态 |
recordTime | 若为录音消息,表示录音时长 |
filePath | 录音文件或图片文件在本地的路径 |
更多详细请查看demo
拼装一条消息
- 文本消息:
使用如下代码
FromToMessage fromToMessage = IMMessage.createTxtMessage(txt);
参数说明: String txt, 消息文本内容.
- 录音消息:
使用如下代码.
FromToMessage fromToMessage = IMMessage.createAudioMessage(mTime, filePath);
参数说明: float mTime, 录音时长 String filePath, 录音在本地的路径
- 图片消息:
使用如下代码
FromToMessage fromToMessage = IMMessage.createImageMessage(picFileFullName);
参数说明: String picFileFullName, 图片在本地的路径
- 文件消息:
FromToMessage fromToMessage = IMMessage.createFileMessage(path, fileName, fileSizeStr);
参数说明: String path, 文件在本地的路径 String fileName, 文件名字 String fileSizeStr, 文件大小 拼装好的消息在发送时用到。
发送消息
使用如下代码:
IMChat.getInstance().sendMessage(fromToMessage, new ChatListener() {
@Override
public void onSuccess() {
}
@Override
public void onFailed() {
}
@Override
public void onProgress() {
}
});
参数说明: FromToMessage fromToMessage, 要发送的消息 ChatListener ,消息发送的接口监听,发送成功,失败或正在发送,该回调接口中可以直接进行界面的操作。发送的消息存到了本地数据库中,具体可参看提供的demo
录制MP3格式语音
由于跨平台的需要,发送的录音文件格式需为mp3格式,因此提供了录制mp3格式的方法,代码如下:
MP3Recorder mp3Recorder = new MP3Recorder(file);//初始化录音器
mp3Recorder.start();//开始录制
mp3Recorder.stop();//结束录制
其中的参数为:File file录音保存文件,具体使用可参看提供的demo
重发消息
当有时候发送失败后,需重新发送该条消息,代码如下:
IMChat.getInstance().reSendMessage(fromToMessage, new ChatListener() {
@Override
public void onSuccess() {
}
@Override
public void onFailed() {
}
@Override
public void onProgress() {
}
});
接收新消息
需通过注册广播来获取新消息,首先需要一个全局注册的广播,在AndroidManifest.xml中代码为:
<receiver
android:name="com.m7.imkfsdk.receiver.NewMsgReceiver"
android:enabled="true"
>
<intent-filter android:priority="2147483647" >
<!—修改此action为自己定义的,该action必须和SDK初始化接口中所填的一样,举例如下-->
<action android:name=“com.m7.demo.action” />
</intent-filter>
</receiver>
请先修改此action的值,和SDK初始化时传入的值必须相同,否则接收不到新消息的广播,注意当接收到该广播后,消息已经保存到了本地的数据库中了。具体请查看demo。
获取数据库中的消息
在界面上显示消息就得先从数据库中获得消息数据,代码如下:
List<FromToMessage>fromToMessages=IMChatManager.getInstance().getMessages(1);
参数中的数字为取第几页的数据,用于下拉加载更多消息时使用,默认是一页15条消息数据。这样就获取到了数据库中的消息了,之后就可以在界面进行显示操作了。具体参考demo中。
更新一条消息数据到数据库中
若需要将消息的数据修改后保存到数据库中,代码如下:
IMChatManager.getInstance().updateMessageToDB(message);
参数为FromToMessage message,修改数据后的消息。
判断数据库中数据是否都取出
界面显示时需要判断本地数据库中的数据是否已经被全部取出,代码如下:
IMChatManager.getInstance().isReachEndMessage(size);
获取评价列表数据
获取后台配置的评价列表数据,代码如下:
List<Investigate> investigates = IMChatManager.getInstance().getInvestigate();
返回的结果结果为:List investigates,即为评价实体的列表,Investigate中的name属性为该评价的名称,可用来显示在界面上。
提交评价结果
代码如下:
IMChatManager.getInstance().submitInvestigate(investigate, new SubmitInvestigateListener() {
@Override
public void onSuccess() {
Toast.makeText(InvestigateActivity.this, "评价提交成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed() {
Toast.makeText(InvestigateActivity.this, "评价提交失败",Toast.LENGTH_SHORT).show();
}
});
参数为: Investigate investigate 评价实体 SubmitInvestigateListener 提交评价回调接口 注:该接口只有在与人工客服聊天过后评价才有意义。
客服主动发起的评价
客服在服务完客户后也可以主动发起评价的请求,客户端需要作出相应的响应,客户端在聊天界面注册相应的广播,接收到相应的事件会生成一个评价的消息,点击完评价之后该消息会被删除,生成评价消息的代码如下:
private void sendInvestigate() {
ArrayList<Investigate> investigates = (ArrayList<Investigate>) IMChatManager.getInstance().getInvestigate();
IMMessage.createInvestigateMessage(investigates);
updateMessage();
}
工号、姓名、头像推送
在接入聊天会话后,会把客服人员的工号、姓名和头像信息推送回来。聊天界面中通过接收IMChatManager.USERINFO_ACTION的广播来获取对应数据。
访客无响应断开对话时长配置获取
通过GlobalSet globalSet = GlobalSetDao.getInstance().getGlobalSet();来获取配置信息,里面的break_len代表断开对话时长,break_tips_len代表断开前提示时长,break_tips代表提示内容。
关闭SDK
若需关闭sdk 会话页面,则可以调用该接口,代码如下:
IMChatManager.getInstance().quitSDk();
注意:只是关闭访客这边sdk的会话页面,坐席侧会话依然存在,并不是关闭会话方法
设置IP地址(私有云用户)
若需设置自己服务器的地址(在初始化init()之前调用以下方法),代码如下:
RequestUrl.setRequestUrl()(String http)
参数说明 http:使用的Http服务
开启关闭log打印
sdk中包含帮助开发人员开发的数据log,上线时可根据需求开关,代码如下:
//关闭log
IMChatManager.getInstance().closeLog();
//打开log
IMChatManager.getInstance().openLog();
获取sdk版本号
获取当前使用的IMKFSdk版本号
//获取sdk版本号
IMChatManager.getInstance().getSdkVersion();
混淆配置
因sdk中使用到七牛,eventbus,glide等三方库,以下混淆代码除 ‘KF’ 片段外只针对sdk使用依赖库版本提供混淆示例,更多详细的混淆配置可根据三方依赖库官方文档配置。
如果配置了音视频依赖,那么视频部分的依赖一定要添加,如果没有配置那客户忽略这部分混淆
注意:shrinkResources设置为false,不然表情显示不正确
混淆代码:
-keepattributes *Annotation*
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keepattributes *DatabaseField*
-keepattributes *DatabaseTable*
-keepattributes *SerializedName*
-keep class **.R$* {*;}
-ignorewarnings
#**************************************imkf客服**必要配置****************************************
#-------KF------
-dontwarn com.m7.imkfsdk.**
-keep class com.m7.imkfsdk.** { *; }
-dontwarn com.moor.imkf.**
-keep class com.moor.imkf.** { *; }
#软键盘
-dontwarn com.effective.android.panel.**
-keep class com.effective.android.panel.** { *; }
#---------KF------
#---------依赖库------
#七牛
-dontwarn com.qiniu.**
-keep class com.qiniu.**{*;}
-keep class com.qiniu.**{public <init>();}
# OkHttp3
-dontwarn okhttp3.**
-keep class okhttp3.** { *;}
# Okio
-dontwarn com.squareup.**
-dontwarn okio.**
-keep public class org.codehaus.* { *; }
-keep public class java.nio.* { *; }
#GSON
-dontwarn sun.misc.**
-keep class com.google.gson.examples.android.model.** { <fields>; }
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keepclassmembers,allowobfuscation class * {@com.google.gson.annotations.SerializedName <fields>;}
#eventbus
-dontwarn org.greenrobot.eventbus.**
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keepclassmembers class ** {
public void onEvent*(**);
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
#glide
-dontwarn com.bumptech.glide.**
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep class * extends com.bumptech.glide.module.AppGlideModule {
<init>(...);
}
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder {
*** rewind();
}
#OrmLite,sqlcipher
-keep class com.j256.** { *; }
-keep class com.j256.**
-keepclassmembers class com.j256.**
-keep enum com.j256.**
-keepclassmembers enum com.j256.**
-keep interface com.j256.**
-keepclassmembers interface com.j256.**
-dontwarn net.sqlcipher.**
-keep class net.sqlcipher.** {*;}
#**************************************imkf客服**必要配置**************************************
#**************************************imkf视频****************************************
#如果不使用视频功能并且没有添加视频依赖 可以注释此部分混淆
#如果使用视频功能 一定要配置这部分混淆
# React Native
# Keep our interfaces so they can be used by other ProGuard rules.
# See http://sourceforge.net/p/proguard/bugs/466/
-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters
-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.facebook.proguard.annotations.DoNotStrip class *
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
@com.facebook.proguard.annotations.DoNotStrip *;
@com.facebook.common.internal.DoNotStrip *;
}
-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
void set*(***);
*** get*();
}
-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
-keep class * extends com.facebook.react.bridge.NativeModule { *; }
-keepclassmembers,includedescriptorclasses class * { native <methods>; }
-keepclassmembers class * { @com.facebook.react.uimanager.UIProp <fields>; }
-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp <methods>; }
-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; }
-dontwarn com.facebook.react.**
-keep,includedescriptorclasses class com.facebook.react.bridge.** { *; }
# WebRTC
-keep class org.webrtc.** { *; }
-dontwarn org.chromium.build.BuildHooksAndroid
# Jisti Meet SDK
-keep class org.jitsi.meet.** { *; }
-keep class org.jitsi.meet.sdk.** { *; }
# We added the following when we switched minifyEnabled on. Probably because we
# ran the app and hit problems...
-keep class com.facebook.react.bridge.CatalystInstanceImpl { *; }
-keep class com.facebook.react.bridge.ExecutorToken { *; }
-keep class com.facebook.react.bridge.JavaScriptExecutor { *; }
-keep class com.facebook.react.bridge.ModuleRegistryHolder { *; }
-keep class com.facebook.react.bridge.ReadableType { *; }
-keep class com.facebook.react.bridge.queue.NativeRunnable { *; }
-keep class com.facebook.react.devsupport.** { *; }
-dontwarn com.facebook.react.devsupport.**
-dontwarn com.google.appengine.**
-dontwarn com.squareup.okhttp.**
-dontwarn javax.servlet.**
# ^^^ We added the above when we switched minifyEnabled on.
# Rule to avoid build errors related to SVGs.
-keep public class com.horcrux.svg.** {*;}
# https://github.com/facebook/fresco/issues/2638
-keep public class com.facebook.imageutils.** {
public *;
}
#*************************************imkf视频****************************************
六、延伸功能
1、如需自定义用户头像和机器人头像
2、设置专属座席功能
sdk v3.8.0提供了配置拓展信息的接口
-
版本号≥3.8.0
在demo 的初始化方法前提供了setOtherParams()示例 如果需要设置 专属坐席 第一个参数传入坐席id 即可
/**
* 添加要使用的 拓展信息内容
* @param agentId 专属坐席id
* @param otherObject: 添加拓展字段的数据
* @param useUserLabels: 是否使用user_labels参数
* @param user_labels: user_labels字段数据
*/
public void setUserOtherParams(String agentId,JSONObject otherObject, boolean useUserLabels, JSONObject user_labels)
- 版本小于3.8.0
调用beginSession的重载方法,可传入json字符串,示例如下,需在 ChatActivity 中对原有的 beginSession 进行修改,不可单独调用
String otherParams = "";
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("agent", "8131");
} catch (JSONException e) {
e.printStackTrace();
}
otherParams = jsonObject.toString();
IMChatManager.getInstance().beginSession(peerId, otherParams, new OnSessionBeginListener() {})
3、设置扩展信息
sdk v3.7.0提供了配置拓展信息接口
-
版本号≥3.7.0
在demo 的初始化方法前提供了setOtherParams()示例
/**
* 添加要使用的 拓展信息内容
* @param agentId 专属坐席id
* @param otherObject: 添加拓展字段的数据
* @param useUserLabels: 是否使用user_labels参数
* @param user_labels: user_labels字段数据
*/
public void setUserOtherParams(String agentId,JSONObject otherObject, boolean useUserLabels, JSONObject user_labels)
在ChatActivity 的beginSession()和beginScheduleSession()方法使用如下方法来获取字段_ String other_Str = IMChatManager._getInstance()_.getUserOtherParams_()_;
- 版本小于3.7.0
调用beginSession的重载方法,可传入json字符串,示例如下,需在 ChatActivity 中对原有的 beginSession() 和beginScheduleSession()进行修改,不用关注beginsession代码里执行了几次,只增加
//JSONObject j1中可配置您的想要添加的扩展字段,
//key与value根据需求要自定义。
JSONObject j1 = new JSONObject();
j1.put("name","测试扩展字段");
j1.put("other","前面字段可以自定义");
//将j1 添加到JSONObject j2中,注意 j2段代码必须是如下配置。
//不可修改与增加j2 中的key value。直接复制即可。
JSONObject j2 = new JSONObject();
j2.put("customField",URLEncoder.encode(j1.toString()));
j2.toString();
将j2.toString() 得到的String 分别添加到:
1:ChatActivity中的beginSession() 方法 添加:
2:ChatActivity中的beginScheduleSession() 方法 添加:
注意 : 设置扩展信息一定要确保会话是一次全新的会话,即第一次进入会话设置才会有效。
4、发送商品链接
在初始化之前调用setCard(new CardInfo())
查看示例代码
CardInfo ci = new CardInfo("图片url", "第一行内容", "第二行内容", "第三行内容", "点击跳转链接");
//设置card
helper.setCard(ci);
//设置参数初始化
helper.initSdkChat("com.m7.imkf.KEFU_NEW_MSG",
"请填写后台获取的accessId",
"hhtest",
"userId");
如果商品信息中包含了特殊字符的话,特殊字符的地方要加上转义,为了兼容所有字段可能出现特殊字符,全部增加转码如下,为了前端可以正常展示,前端要相应的转码
try {
ci = new CardInfo(URLEncoder.encode(icon, "utf-8"), URLEncoder.encode(title, "utf-8"), URLEncoder.encode(content, "utf-8"), URLEncoder.encode(rigth3, "utf-8"),
URLEncoder.encode(s, "utf-8"));
} catch (Exception e) {
e.printStackTrace();
}
//设置card
helper.setCard(ci);
5、开启后主动会话(后台选择sdk模式)
- 关闭会话依旧保持长连接(demo中为R.id.chat_tv_back的注销按钮,以及 onBackPressed 事件)
IMChatManager.getInstance().onLineQuitSDK();
- 获取未读消息数
int unReadCount = IMChatManager.getInstance().getMsgUnReadCount();
注意:如果选用sdk的主动回话功能,因为安卓没有统一的离线推送机制,本解决方案只是在用户注销时,其实后台长连接进程还在,短时间坐席发送的消息可以收到,时间一长或者app重启,休眠都会造成后台进程断开;(用户可以采用url推送,借助app的推送机制进行推送消息(eg:华为离线推送、小米离线推送等))
6、本sdk支持中文和英文显示切换
- 如需移植到项目中,请将values-en下的string.xml复制到项目中该文件下
- 默认sdk语言环境跟随手机系统变化
-
若需手动切换可在sdk初始化之前调用demo MainActivity提供的切换英文语言方法initLanguage_()_示例
也可以使用您App中原有的语言切换配置方法。
7、聊天关闭后获取消息未读数
/*
获取未读消息数
注意:调用此方法前也需要先配置服务
@param accessId 接入id(需后台配置获取)
@param userName 用户名
@param userId 用户id
*/
IMChatManager.getInstance().getMsgUnReadCountFromService(
accessId, userName, userId, new IMChatManager.HttpUnReadListen() {
@Override
public void getUnRead(int acount) {
Toast.makeText(MainActivity.this, getString(R.string.ykfsdk_ykf_unreadmsg) + " " + acount, Toast.LENGTH_SHORT).show();
}
});
七、常见问题处理
1、点击录音按钮异常或者初始化报关于.so的错误
so库支持: 'armeabi' 'armeabi-v7a' 'arm64-v8a' 'x86' 'x86_64'
配置方式:
在ykfsdk和app 层的defaultConfig 添加对应所需要的abiFilters即可
离线资源:录音相关的 (点击下载so库)
2、消息接收不显示,但在发送消息后同时显示之前接收的消息
可能原因:
检查com.m7.imkfsdk.receiver.NewMsgReceiver的文件是否和demo中的文件包名是否一致(因jar中广播指向的是该包名下的NewMsgReceiver,android8.0以后广播需携带包名)
3、客服im退出后,再次进入客服聊天界面异常、闪退
可能原因:在点击退出按钮是未添加退出sdk代码.
//退出聊天界面就注销了SDK,若不需要注销则把该处代码去掉
IMChatManager.getInstance().quitSDk();
4、sdk集成后表情显示不出来
原因:1、assets文件下表情对应关系 emojikf不存在
2、未添加表情初始化代码
解决:将demo里的emojikf文件拷贝到项目中该目录下、添加初始化代码·
//初始化表情
new Thread(new Runnable() {
@Override
public void run() {
com.m7.imkfsdk.utils.FaceConversionUtil.getInstace().
getFileText(getApplicationContext());
}
}).start();
5、商品发送链接客户端发送出去pc坐席端收不到
解决:将发送点击链接进行utf-8转码
CardInfo ci = null;
try {
ci = new CardInfo("http://seopic.699pic.com/photo/40023/0579.jpg_wh1200.jpg",
"我是一个标题当初读书",
"我是name当初读书。",
"价格 1000-9999",
URLEncoder.encode(s, "utf-8"));
} catch (Exception e) {
e.printStackTrace();
}
helper.setCard(ci);
6、sdk初始化回调错误码说明
1001:初始化超时,检查网络环境或服务配置 1002:获取tcp或ws服务失败 1004:登录失败 1005:消息发送失败未知错误 1006:初始化之前没有调用RequestUrl.setRequestUrl()或RequestUrl.setRequestUrl(); 1007:进入会话没有携带技能组id 1008:进入会话没有携带日程所需字段 1009:进入会话没有携带会话类型
7:Android是否提供支持Androidx的sdk包?
包含在下载的zip文件中
8:Android集成sdk初始化后报错:
java.lang.NullPointerException: url == null at okhttp3.Request$Builder.url(SourceFile:156) 检查在helper.initSdkChat之前是否调用了环境配置 RequestUrl.setRequestBasic();
9:Android混淆打包后进入会话页面报错:
如果代码设置了release或debug 打包混淆,需要查看是否添加了sdk的混淆配置。 具体混淆配置请查看下载的sdk压缩包中提供的集成文档。
10:Android如何配置离线推送?
前往pc后台设置-app设置-找到配置App名称。 点击修改配置您服务端的Http服务地址,当访客离线后我们会推送消息到配置的服务地址。当您的后端收到这个消息后可以进行App分发推送。推送实现您可以保持项目原有推送逻辑。如果您的App之前没有推送功能那么需要新对接其他推送服务。
12:Android导入sdk后依赖包冲突
sdk中使用了Qiniu,gson,eventbus,glide等依赖库,如果集成导入后造成项目依赖冲突可以尝试以下两种方案: 1:调整您项目的moudle依赖顺序,项目使用sdk中所提供的依赖库版本。 2:进行依赖排除,使用exclude排除sdk中提供的依赖包。
13:gradle版本与Android studio不一致或版本过高
为保障良好的开发体验和更好的性能,强烈建议保持Android Studio 为最新版本 sdk v3.6.0目前最低支持 Plugin version 3.2.0+,Required Gradle version 4.6+ 以上版本 如果您的项目还在使用Plugin version 3.2.0以下版本: 1:3.2.0发布时间为2018.9月,可以满足大多数的新版三方类库以及Android 各个版本的兼容,强烈建议您升级Android Studio 或使用新版的gradle编译工具 2:可以操作依赖排除本sdk中的Gson 库,重新集成一个较低版本的Gson库,因为sdk使用Gson推荐版本2.8.6版本不支持 3.2.0以下编译工具。
14:video-call-sdk 依赖下载报错
音视频SDK 遇到video-call-sdk依赖无法下载或下载困难,请查看网络是否可以正常访问github,可以上网获取github host修改方案调整电脑的网络配置,或将maven仓库更换为测试可用的镜像加速仓库。
八、版本说明
版本更新4.8.0:
增加卡⽚类型的按钮展示规则 增加满意度星级评价 优化sdk性能及修复⼀些已知问题
版本更新4.7.0:
- 增加切换机器⼈功能
- 增加 xbot 推联答案的⽀持
- 优化sdk性能及修复⼀些已知问题
版本更新4.6.0:
- 新增修改获取聊下消息默认条件
- 新增通过sql语句获取聊天数据
- 优化访客⽆响应断开提示
- 优化消息列表查询条件并增加⾃定义sql查询msg
- ⽀持动态配置⻚⾯按钮
- 优化⽆满意度配置提示
- 优化sdk性能及修复⼀些已知问题
版本更新4.5.0:
- 优化满意度评价显示
- 优化sdk性能及修复⼀些已知问题
版本更新4.4.0:
- 优化卡⽚展示样式
- 优化附件显示
- 优化机器⼈富⽂本显示
版本更新4.3.1
- 优化 xbot 机器人转人工
- 优化暗黑模式
4.3.0 更新日志
- 新增转人工类型数据统计
- 新增华为云初始化配置
- 优化sdk全局配置保存
- 优化sdk性能及修复一些已知问题
4.2.0 更新日志
- 增加相机拍摄图片
- 增加xbot快捷提问功能
- 增加排队保持设置
- 优化sdk性能及修复一些已知问题
4.1.0 更新日志
- 增加访客与坐席正在输入提示
- 优化xbot机器人消息富文本展示
- 优化图片查看
- 调整sdk依赖结构
- 优化sdk性能及修复一些已知问题
4.0.0 更新日志
- 增加技能组情况下无坐席在线跳转留言提示弹窗
- 增加坐席结束会话不隐藏输入框,可再次发起回话
- 留言页面样式调整
- 优化sdk性能及修复一些已知bug
3.9.0 更新日志
- 增加xbot机器人状态下发送卡片类型消息触发机器人的未知回复
- 优化数据库性能
- 未读消息数量获取接口获取AndroidID合规优化
- 输入联想关键词匹配正则优化
- 优化sdk性能及修复一些已知bug
3.8.0 更新日志
- 增加xbot机器人快捷菜单功能
- 增加xbot机器人分组常见问题logo图片动态配置
- 优化sdk性能及修复一些已知bug
3.7.0 更新日志
- 增加xbot机器人订单卡片和物流卡片功能。
- 支持配置人工状态下的联想输入功能。
- sdk内部初始化逻辑优化
- 优化评价功能
- demo资源文件优化
- 优化sdk性能及修复一些已知bug
3.6.0 更新日志
- 增加xbot 机器人表单功能。
- 优化sdk体验及修复一些已知bug
3.5.0 更新日志
- SDK增加满意度邀评按钮&满意度历史消息回显
- 文本中包含图片时,文本宽度的自适应问题优化
- SDK初始化过程中失败 ,增加超时错误提示
- 增加xbot 常见问题支持分组
- 增加xbot 支持多选按钮
- 联想关键词相匹配的标为红色
- 发送消息接口回调处理
3.4.0 更新日志
- UI升级,全新的UI设计。
- 支持消息已读未读 展示。
- 增加访客点击座席发送的满意度评价链接的数据统计。
- 留言内容展示到消息列表中。
3.2.9 更新日志
- 新增xobt机器人消息支持视频类型。
- 新增xbot机器人消息支持电话号类型点击。
- 新增xbot机器人消息支持配置转人工类型文字按钮。
- 支持使用websocket服务连接。
- 发送文件大小提高至200Mb。
3.2.8 更新日志
- 新增接收的消息消息文本中如包含电话号码,可以点击复制或呼叫。
- 优化满意度评价窗口样式,文字长度最大限制50字。
- 新增点击注销按钮满意度弹窗,支持PC端后台控制。
- 新增支持用户在pc端对点赞点踩自定义文案展示。
- 新增支持用户在pc端自定义选择xbot消息展示的点选样式。
- 优化sdk体验及修复若干已知bug。
3.2.7 更新日志
- 新增语音转文本功能
- 新增支持坐席配置是否允许访客发起评价
- 新增系统头像显示
- 优化xbot机器人自动转人工不在线的留言提示
- 修复特殊机型或特殊屏幕设置导致评价窗口展示不完整可滑动展示
- 修复专属坐席不在线转其他坐席逻辑
- 修复sdk中已知bug
3.2.6 更新日志
- 适配Android Q版本
- 添加无技能组提示
- 修复键盘弹出不隐藏加号布局bug
3.2.6更新日志
- 新增xbot卡片消息
- 新增满意度评价的时效性、必填项功能
- 新增常见问题功能
- 修复sdk转人工按钮显示异常bug
- 修复文件消息-文件名展示异常bug
3.2.5更新日志
- 优化Android10系统获取设备Id
- xBot机器⼈,增加底部滑动提示输入信息
- 优化某些机型选择图⽚后无法发送的问题
- 优化转人工按钮显示逻辑
3.2.4更新日志
- 某些机型大图预览展示不完整问题
- xbot2 机器人问题列表点选功能
- 修复商品链接不跳转的问题
- 修正SDK所有接口请求成功后返回值类型
- 某些机型发送txt文件会闪退
- 修复某些机型LogUtils 初始化闪退的问题
- glide版本 增加4.9兼容代码
- 兼容编译版本27+
3.2.3更新日志
- 增加了xbot机器人功能
- 修复了机器人关联问题的bug
3.2.2更新日志
- 双网络切换导致tcp链接出现的问题
- 网络监听,校验优化
- 增加图片长按复制功能
- 增加文本长按复制功能
- 满意逻辑重新调整,优化
- 小陌机器人头像展示pc端设置
- SDK在开启会话接口(beginSession)执行返回成功之后才能发送消息
- 增加日程情况下也可以支持商品信息
3.2.0更新日志
- 小陌机器人的回答中增加有无帮助数的选择和感谢文案
- 消息模型增加robotMsgId字段,给小陌报表查看会话时调用数据
- 小陌机器人显示满意度评价, 其他机器人不展示满意度评价按钮,只有机器人说话后才可以评价,且一个会话只能评价一次,不能重复评价
- 座席的满意度评价界面改版,增加二级评价标签,评价逻辑维持原来的不变
- 支持自定义排队时文案提示
- 线上问题处理:增加推送activeClaim字段的处理,部分机型语音发送有问题(如:小米Mix2)
- 优化断线重连,提升稳定性
- 修复用户断线之后,坐席结束会话导致的异常
- 部分机型录制语音出现的bug修复
- 会话频繁重连接入,导致会话生成多个,并且不能离线
- 修复android版本低于6.0会直接闪退,打不开demo
- 修复小陌机器人会一直重复推送提示消息,直到app死掉
- 修复app长期处于后台切换为前台时访客无法在线问题
3.1.0更新日志
- 在线客服连接时增加机型、SDK 版本号等字段
- 优化设备 ID 的获取
- 帮助评价文案修改
3.0.0更新日志
- TCP 与 HTTP 服务器地址动态切换以及重连
- 录音无法播放 bug 修复
- 优化集成步骤
2.8.4更新日志
- 转人工按钮的显示配置
- 留言和满意度文案的配置
- 访客回复消息再接入会话配置
- 优化部分体验
2.8.3更新日志
- 优化消息数据库存取标记(适配支持useid和peedid自有选择)
- 调整在线客服入口文件(隐藏广播action)
- 修复获取聊天未读消息数的异常
- 优化部分体验
2.8.2更新日志
- 修复文件下载和文件打开版本适配问题
- 修改消息记录显示以userId的依据(同一userId的用户可以看见聊天记录)
- 优化部分代码、修复已发现bug
2.8.1更新日志
- 调整代码入口代码
- 调整录音、照相权限申请位置
- 添加商品链接功能
- 修复android8.0以后广播和通知接受异常
2.8.0更新日志
- 添加主动会话功能
- 优化部分代码
- 修复一发现bug
2.7.1更新日志
- 支持国际英文版
- 优化部分代码
- 修复已发现异常
2.7.0更新日志
- 取消demo里面关于application 的部分(demo中MobileApplication文件)
- 之前所有的 MobileApplication.isSDK 的判断全改为IMChatManager.isKFSDK
- 将之前MobileApplication类中的 表情的初始化 移到 MainActivty 类
- 优化部分代码
- 修复发现bug
- 删除多余文件,减少体积