访客 Android SDK

1.1下载SDK

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.1初始化SDK

需要在Application的onCreate方法中调用,即应用启动时进行SDK初始化。

方法名称SDK初始化
方法JXImManager.getInstance().init(applicationContext, appKey);
入参参数名类型说明
applicationContextContextAppliction的上下文对象
appKeyString开发者通过开发者平台新建的应用的appkey

3.2开启关闭调试功能

  • 调试功能开启或关闭影响SDK输出日志信息。
  • 开启调试模式输出的日志级别:verbose/debug/info/warn/error。
  • 关闭调试模式只输出日志级别:warn/error。
方法名称开启或关闭调试功能
方法JXImManager.getInstance().setDebugMode(debugMode);
入参参数名类型说明
debugModebooleantrue: 开启调试功能
false: 关闭调试功能

4.1请求客服前初始化

每次请求客服前,app层必须调用该接口进行初始化,该接口会为访客创建账号并登陆。该接口从之前的SDK层移到了UI模板层,开发者通过依赖UI模板工程可直接调用。

方法名称请求客服前初始化
方法AccoutHelper.getIntance().initMcsRequest(Context context , OnInitMcsRequestCallback callback);
入参参数名类型说明
contextContext上下文对象
callbackOnInitMcsResquestCallbackMcs用户端初始化的回调接口
  • 示例代码:
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:其他错误
入参参数名类型说明
skillsIdString技能组Id

4.4访客取消等待

方法名称用户取消等待(需异步执行,当用户处于等待状态时调用)
方法JXImManager.McsUser.getInstance().cancelWait(String skillsId) throws JXException;
异常JXException
异常errorCode存在如下取值
JXErrorCode.NO_CONNECTION: client没有连接到服务端
Mcs.NOT_INWAITING: 处于非等待状态时,无法取消等待
JXErrorCode.OTHER:其他错误
入参参数名类型说明
skillsIdString技能组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:其他错误
入参参数名类型说明
skillsIDString技能组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:其他错误
入参参数名类型说明
skillsIDString技能组ID

4.7添加客服状态的监听器

方法名称添加客服状态监听器
方法JXImManager.McsUser.getInstance().addMcsStatusListener(JXMcsStatusListener listener);
入参参数名类型说明
listenerJXMcsStatusListener客服状态的监听器

4.8移除客服状态监听器

方法名称移除客服状态的监听器(监听用户与客服聊天时,客服的状态)
方法JXImManager.McsUser.getInstance().removeMcsStatusListener(JXMcsStatusListener listener);
入参参数名类型说明
listenerJXMcsStatusListener客服状态的监听器

JXMcsStatusListener监听器说明:

     /**
     * 客服处于离线
     */
    public void onMcsOffline(String skillsId);

4.9添加用户在请求队列中状态的监听器

方法名称监听用户在请求队列中状态
方法JXImManager.McsUser.getInstance().addUserSelfQueueListeners(JXUserSelfQueueListener listener) ;
入参参数名类型说明
listenerJXUserSelfQueueListener用户请求客服的监听器
  • 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);
入参参数名类型说明
listenerJXUserSelfQueueListener用户请求客服的监听器

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:其他错误
入参参数名类型说明
skillsIDString技能组ID

4.13发送预知消息

发送访客正在编辑的消息时,发送预知消息给客服。

方法名称发送预知消息
方法JXImManager.McsUser.getIntance().sendChatStateManager(String state , String content);
入参参数名类型说明
stateString输入状态
contentString输入内容
  • 输入状态取值如下:
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);
入参参数名类型说明
skillsIdString技能组Id
返回值类型说明
String留言页面url

4.15满意度评价

4.15.1获取满意度配置

在访客登录时,SDK内部已从服务器获取了满意度配置,通过JXConversation对象即可获取满意度评价配置。JXSatisfication对象配置包括:评价邀请语、评价反馈语、评价类型(评满意度、评分、评星级、自定义)、评价选项。

方法名称获取满意度配置
方法Jconversation.getSatisfication();
返回值类型说明
JXSatisfication满意度信息对象

4.15.2提交满意度评价

访客提交满意度评价同样是通过JXConversation对象来操作。

方法名称提交满意度评价(需要异步调用)
方法conversation.submitSatisfication(int value)
入参参数名类型说明
Valueint对客服服务的评价等级,默认有1-5五个级别,可在开发者中心自定义。
返回值类型说明
Boolean提交结果成功与否

4.15.3保存用户评价反馈消息

访客提交满意度评价后,需要收到反馈信息,此接口用于保存反馈消息。

方法名称保存用户评价反馈消息
方法JXImManager.McsUser.getInstance.saveEvaluateFeedbackMessage(String username , String feedback)
入参参数名类型说明
usernameString消息来源用户名,可为空或管理等。
feedbackString反馈语,从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是否可以发送表情

打包时需要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.** {*;}