访客 Android SDK
1前提
1.1下载SDK
到佳信官网下载页面下载SDK
2项目配置
2.1导入SDK
将目标jar文件(lib_jx_im_alone.jar)引入到工程中,置于libs/ 目录下,如下图:
2.2配置信息
在项目配置文件AndroidManifest.xml中添加如下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 录音权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 多媒体权限 --> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.RECORD_VIDEO"/>
添加service、receiver 配置信息:
<!-- service --> <service> android:name="com.jxccp.im.chat.JXCoreService" android:enabled="true"> <intent-filter> <actionandroid:name="com.jxccp.im.chat.JXCoreService"/> </intent-filter> </service>
3初始化
3.1初始化SDK
需要在Application的onCreate方法中调用,即应用启动时进行SDK初始化。
方法名称 | SDK初始化 | ||
---|---|---|---|
方法 | JXImManager.getInstance().init(applicationContext, appKey); | ||
入参 | 参数名 | 类型 | 说明 |
applicationContext | Context | Appliction的上下文对象 | |
appKey | String | 开发者通过开发者平台新建的应用的appkey |
3.2开启关闭调试功能
- 调试功能开启或关闭影响SDK输出日志信息。
- 开启调试模式输出的日志级别:verbose/debug/info/warn/error。
- 关闭调试模式只输出日志级别:warn/error。
方法名称 | 开启或关闭调试功能 | ||
---|---|---|---|
方法 | JXImManager.getInstance().setDebugMode(debugMode); | ||
入参 | 参数名 | 类型 | 说明 |
debugMode | boolean | true: 开启调试功能 false: 关闭调试功能 |
4访客功能实现
4.1请求客服前初始化
每次请求客服前,app层必须调用该接口进行初始化,该接口会为访客创建账号并登陆。该接口从之前的SDK层移到了UI模板层,开发者通过依赖UI模板工程可直接调用。
方法名称 | 请求客服前初始化 | ||
---|---|---|---|
方法 | AccoutHelper.getIntance().initMcsRequest(Context context , OnInitMcsRequestCallback callback); | ||
入参 | 参数名 | 类型 | 说明 |
context | Context | 上下文对象 | |
callback | OnInitMcsResquestCallback | Mcs用户端初始化的回调接口 |
- 示例代码:
AccountHelper.getInstance().initMcsRequest(getApplicationContext(), new OnInitMcsRequestCallback() { @Override public void onInitMcsResult(final int code) { runOnUiThread(new Runnable() { public void run() { if (code == Mcs.MCS_USER_INIT_SUCCESS) { JXWorkgroup workgroup = JXImManager.McsUser.getInstance().isNeedRequest(); if(workgroup == null){ fetchWorkgroupFromServer(); }else{ requestCustomerService(workgroup.getMcsId(), workgroup.getDisplayName()); } } else if (code == JXErrorCode.APPKEY_NOT_EXIST) { CommonUtils.showToast(getApplicationContext(), getString(R.string.appkey_not_exist)); finish(); } else { CommonUtils.showToast(getApplicationContext(), getString(R.string.request_customerFailed)); finish(); } } }); } }); }
4.2获取企业下的所有技能组
方法名称 | 获取企业下的所有技能组(需异步执行) | |
---|---|---|
方法 | JXImManager.McsUser.getInstance().getCustomerServices() throws JXException; | |
异常 | JXException 异常errorCode存在如下取值 JXErrorCode.NO_CONNECTION: client没有连接到服务端 JXErrorCode.OTHER:其他错误 |
|
返回值 | 类型 | 说明 |
List<JXWorkgroup> | 技能组的集合,主要信息包括:技能组ID和技能组名称 |
4.3访客请求客服
请求客服前必须确认8.1步骤中initMcsRequest的初始化是否成功。
方法名称 | 请求客服(需异步执行) | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().requestCustomerService(String skillsId) throws JXException; | ||
异常 | JXException 异常errorCode存在如下取值 JXErrorCode.NO_CONNECTION: client没有连接到服务端 Mcs.NOT_INSERVICE:请求客服时,技能组无客服人员在线 Mcs.SKILLS_ID_NOT_EXIST:技能组ID不存在 Mcs.AFTER_WORK_NOT_ACCEPT:下班不接入会话 Mcs.NOT_INSERVICE_WITH_ROBOT 无客服在线但有机器人能力 JXErrorCode.OTHER:其他错误 |
||
入参 | 参数名 | 类型 | 说明 |
skillsId | String | 技能组Id |
4.4访客取消等待
方法名称 | 用户取消等待(需异步执行,当用户处于等待状态时调用) | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().cancelWait(String skillsId) throws JXException; | ||
异常 | JXException 异常errorCode存在如下取值 JXErrorCode.NO_CONNECTION: client没有连接到服务端 Mcs.NOT_INWAITING: 处于非等待状态时,无法取消等待 JXErrorCode.OTHER:其他错误 |
||
入参 | 参数名 | 类型 | 说明 |
skillsId | String | 技能组ID |
4.5转接到人工客服
方法名称 | 转接到人工客服(需异步执行) | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().transferCustomerService(String skillsId) throws JXException; | ||
异常 | JXException 异常errorCode存在如下取值 JXErrorCode.NO_CONNECTION: client没有连接到服务端 JXErrorCode.NETWORK_TIMEOUT:请求服务器超时 MCS.NOT_INSERVICE_WITH_ROBOT:无客服人员在线,但具有机器人能力 Mcs.SKILLS_ID_NOT_EXIST:技能组ID不存在 JXErrorCode.OTHER:其他错误 |
||
入参 | 参数名 | 类型 | 说明 |
skillsID | String | 技能组ID |
4.6转接到机器人服务
方法名称 | 转接到机器人服务(需异步执行) | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().transferRobot(String skillsId) throws JXException; | ||
异常 | JXException 异常errorCode存在如下取值 JXErrorCode.NO_CONNECTION: client没有连接到服务端 JXErrorCode.NETWORK_TIMEOUT:请求服务器超时 MCS.NOT_INSERVICE_WITH_ROBOT:无客服人员在线,但具有机器人能力 Mcs.SKILLS_ID_NOT_EXIST:技能组ID不存在 JXErrorCode.OTHER:其他错误 |
||
入参 | 参数名 | 类型 | 说明 |
skillsID | String | 技能组ID |
4.7添加客服状态的监听器
方法名称 | 添加客服状态监听器 | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().addMcsStatusListener(JXMcsStatusListener listener); | ||
入参 | 参数名 | 类型 | 说明 |
listener | JXMcsStatusListener | 客服状态的监听器 |
4.8移除客服状态监听器
方法名称 | 移除客服状态的监听器(监听用户与客服聊天时,客服的状态) | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().removeMcsStatusListener(JXMcsStatusListener listener); | ||
入参 | 参数名 | 类型 | 说明 |
listener | JXMcsStatusListener | 客服状态的监听器 |
JXMcsStatusListener监听器说明:
/** * 客服处于离线 */ public void onMcsOffline(String skillsId);
4.9添加用户在请求队列中状态的监听器
方法名称 | 监听用户在请求队列中状态 | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().addUserSelfQueueListeners(JXUserSelfQueueListener listener) ; | ||
入参 | 参数名 | 类型 | 说明 |
listener | JXUserSelfQueueListener | 用户请求客服的监听器 |
- JXUserSelfQueueListener 监听器说明:
/** * @author xugs * @Description: 用户自身在队列中位置 * @param skillsId 技能组ID * @param currentPosition 当前队列的位置 * @date 2015-9-6 下午1:56:48 */ public void onUserSelfQueueUpdate(String skillsId, int currentPosition); /** * @author xugs * @Description: 用户状态 * @param skillsId 技能组ID * @param status 用户状态 * @see * <li>{@link JXUserSelfQueueListener#USER_STATUS_DEPARTQUEUE}</li> * <li>{@link JXUserSelfQueueListener#USER_STATUS_INQUEUE}</li> * <li>{@link JXUserSelfQueueListener#USER_STATUS_INSERVICE}</li> * <li>{@link JXUserSelfQueueListener#USER_STATUS_ENTER_SESSION_EXCEPTION}</li> * <li>{@link JXUserSelfQueueListener#USER_STATUS_ENTER_SESSION}</li> * @date 2015-9-8 下午3:30:46 */ public void onUserSelfStatus(String skillsId, int status, String nickName); /** * 会话结束 * @param skillsId * @param reasonCode */ public void onEnded(String skillsId, int reasonCode);
- 用户自身的几种状态:
/** * 用户正在请求客服 */ public static final int USER_STATUS_PENDING = 1; /** * 用户进入到会话 */ public static final int USER_STATUS_WAITING= 2; /** * 用户进入机器人服务 */ public static final int USER_STATUS_ROBOT= 3; /** * 用户处于被服务的状态 */ public static final int USER_STATUS_INSERVICE = 4; /** * 用户进入回呼的状态 */ public static final int USER_STATUS_RECALL= 5; /** * 会话已被结束 */ public static final int USER_STATUS_ENDED = 6;
4.10移除用户在请求队列中状态的监听器
方法名称 | 移除用户在请求队列中状态的监听 | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().removeUserSelfQueueListeners(JXUserSelfQueueListener listener); | ||
入参 | 参数名 | 类型 | 说明 |
listener | JXUserSelfQueueListener | 用户请求客服的监听器 |
4.11判断是否需要重新请求
判断是否需要重新请求,若无需重新请求则返回上一个技能组的ID,反之返回null。
方法名称 | 判读是否需要重新请求 | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().isNeedRequest(); | ||
返回值 | 类型 | 说明 | |
String | 技能组ID或null |
4.12访客主动结束会话
访客主动结束与客服的会话。
方法名称 | 访客主动结束会话(需异步执行) | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().closeSession(String skillsId) throws JXException; | ||
异常 | JXException 异常errorCode存在如下取值 JXErrorCode.NO_CONNECTION: client没有连接到服务端 JXErrorCode.OTHER:其他错误 |
||
入参 | 参数名 | 类型 | 说明 |
skillsID | String | 技能组ID |
4.13发送预知消息
发送访客正在编辑的消息时,发送预知消息给客服。
方法名称 | 发送预知消息 | ||
---|---|---|---|
方法 | JXImManager.McsUser.getIntance().sendChatStateManager(String state , String content); | ||
入参 | 参数名 | 类型 | 说明 |
state | String | 输入状态 | |
content | String | 输入内容 |
- 输入状态取值如下:
public static class JXChatState { /** * 输入中 */ public static final String composing = "composing"; /** * GONE */ public static final String gone = "gone"; }
4.14获取在线留言URL
获取在线留言wap网页URL
方法名称 | 获取在线留言URL | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().getLeaveMsgWebUrl(String skillsId); | ||
入参 | 参数名 | 类型 | 说明 |
skillsId | String | 技能组Id | |
返回值 | 类型 | 说明 | |
String | 留言页面url |
4.15满意度评价
4.15.1获取满意度配置
在访客登录时,SDK内部已从服务器获取了满意度配置,通过JXConversation对象即可获取满意度评价配置。JXSatisfication对象配置包括:评价邀请语、评价反馈语、评价类型(评满意度、评分、评星级、自定义)、评价选项。
方法名称 | 获取满意度配置 | ||
---|---|---|---|
方法 | Jconversation.getSatisfication(); | ||
返回值 | 类型 | 说明 | |
JXSatisfication | 满意度信息对象 |
4.15.2提交满意度评价
访客提交满意度评价同样是通过JXConversation对象来操作。
方法名称 | 提交满意度评价(需要异步调用) | ||
---|---|---|---|
方法 | conversation.submitSatisfication(int value) | ||
入参 | 参数名 | 类型 | 说明 |
Value | int | 对客服服务的评价等级,默认有1-5五个级别,可在开发者中心自定义。 | |
返回值 | 类型 | 说明 | |
Boolean | 提交结果成功与否 |
4.15.3保存用户评价反馈消息
访客提交满意度评价后,需要收到反馈信息,此接口用于保存反馈消息。
方法名称 | 保存用户评价反馈消息 | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance.saveEvaluateFeedbackMessage(String username , String feedback) | ||
入参 | 参数名 | 类型 | 说明 |
username | String | 消息来源用户名,可为空或管理等。 | |
feedback | String | 反馈语,从JXSatisficatin.getThanksMsg()可获得。 |
4.16获取快捷提问列表
在开发者中心配置了快捷提问问题后,可通过此接口来获取快捷提问问题列表。需要注意的是SDK内部在登录时已从网络获取了问题列表并存入缓存,所以问题列表不会随开发者中心的修改而实时修改,需重新登录才会重新获取。
方法名称 | 判读是否需要重新请求 | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().getQuickQuestion(); | ||
返回值 | 类型 | 说明 | |
List<String> | 快捷提问问题列表 |
4.17开发者中心配置项
4.17.1获取坐席头像URL
获取在开发中心配置的自定义头像的URL,如未设置过则为默认头像URL。
方法名称 | 获取坐席头像URL | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().getAgentHeadImage(); | ||
返回值 | 类型 | 说明 | |
String | 坐席头像URL |
4.17.2访客是否可以主动评价
获取开发者中心配置中,访客是否可以主动评价
方法名称 | 访客可否主动评价 | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().isVisitorSatisfyOpen(); | ||
返回值 | 类型 | 说明 | |
Boolean | 访客是否可以主动进行满意度评价 |
4.17.3访客是否发送预知消息
获取开发者中心配置中,是否发送预知消息。
方法名称 | 是否发送预知消息 | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().isPrepareMsgFlagOpen(); | ||
返回值 | 类型 | 说明 | |
Boolean | 是否发送预知消息 |
4.17.4访客是否可以发送表情
获取开发者中心配置中,访客是否可以发送表情
方法名称 | 是否可以发送表情 | ||
---|---|---|---|
方法 | JXImManager.McsUser.getInstance().isCustomerSendEmoticonEnable(); | ||
返回值 | 类型 | 说明 | |
Boolean | 是否可以发送表情 |
5打包混淆
打包时需要keep以下:
-keep class com.alibaba.sdk.android.** {*;} -keep class de.measite.minidns.** {*;} -keep class org.jivesoftware.smack.** {*;} -keep class org.jivesoftware.smackx.** {*;} -keep class org.jxmpp.** {*;} -keep class com.jxccp.** {*;}