本文档分两个版本
-
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_()_;