本文档分两个版本

概述

容联·七陌 云客服平台访客端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_()_;

  • 版本小于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 IMChatManager.getInstance().onLineQuitSDK();

- 获取未读消息数

int unReadCount = IMChatManager.getInstance().getMsgUnReadCount();



注意:如果选用sdk的主动回话功能,因为安卓没有统一的离线推送机制,本解决方案只是在用户注销时,其实后台长连接进程还在,短时间坐席发送的消息可以收到,时间一长或者app重启,休眠都会造成后台进程断开;(用户可以采用url推送,借助app的推送机制进行推送消息(eg:华为离线推送、小米离线推送等))


##### 6、本sdk支持中文和英文显示切换


![](new_imgs2/sdk_Android_2-10.png)


- 如需移植到项目中,请将values-en下的string.xml复制到项目中该文件下
- 默认sdk语言环境跟随手机系统变化
- 若需手动切换可在sdk初始化之前调用demo MainActivity提供的切换英文语言方法initLanguage_()_示例

      也可以使用您App中原有的语言切换配置方法。


##### 7、聊天关闭后获取消息未读数




```java
 /*
             获取未读消息数
             注意:调用此方法前也需要先配置服务
              @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库数量、种类不统一,只要保证每个平台下的so库数量一致,即可决绝问题; 解决:根据项目原有目录添加对应so库

资源:录音相关的  (点击下载so库

注:如果发现以上操作都处理了,目录也一致了,依然报.so 错误,需要把自己app打一个apk文件放桌面,解压一下,解压后查看下lib目录下.so目录是否跟代码中一致。不一致,按照lib上的目录,改成一致的。添加相应的.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包?

访客sdk版本在3.4.0以后的版本,在pc后台下载的sdk压缩包中会包含support和Androidx的支持。   V3.4.0以前版本暂不提供,需要自行进行转换。

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以下编译工具。

六、SDK权限和隐私政策说明

sdk权限点击下方链接查看: https://m.7moor.com/static/m7SdkPermission.html

容联七陌隐私政策说明: https://m.7moor.com/static/m7PrivacyPolicy.html

七、版本说明

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
  • 删除多余文件,减少体积

2客服IMSDK开发指南(Android)(4.3.0)

概述

容联·七陌 云客服平台访客端Android SDK,可由对接企业移动端开发人员通过集成开发实现App内访客端的接入。

我们提供了较为完善的Demo以及Demo ui代码。对接之前,对接企业的负责人或已开通坐席平台的管理员可以下载Demo提供给研发进行运行体验,提前了解SDK能力便于更快速的进行SDK集成和开发工作。

Demo ui提供了一套基础的会话样式示例,如不满足您的样式需求需要您对Demo ui样式进行自定义修改,请详细阅读并了解Demo代码后进行自定义ui。

一、SDK权限和隐私政策说明

sdk权限点击下方链接查看: https://m.7moor.com/static/m7SdkPermission.html

容联七陌隐私政策说明: https://m.7moor.com/static/m7PrivacyPolicy.html

二、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.7moor-tech:7moor_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。

image.png

4、运行KEFUDEMO项目:

  • 该项目为android studio 项目,请用android studio进行打开
  • 项目打开之后填写参数后可直接运行(参数修改文件为MainActivity);

image.png

helper.initSdkChat("请填写后台获取的accessId", "访客昵称", "访客Id");

(填写获取的accessId后可直接运行demo,查看效果)

提醒:accessId + userId +设备号 是访客的唯一标识,尽量保证userId的唯一性

四、开始集成

1、无自定义需求-导入依赖

如果demo提供的ui样式能够满足需求,并且无需对ui以及页面逻辑进行任何改动,可以直接在项目中添加依赖: 1:Android Support项目 api 'com.github.7moor-tech:7moor_visitorIm_sdkUi' 2:Android X 项目 api 'com.github.7moor-tech:7moor_visitorIm_sdkUiAx'

依赖版本号具体可以参考下载压缩包中的 kfsdk_moudle_AAR项目,使用其配套的远程版本号。

2、自定义UI以及页面自定义调整-导入ykfsdk Moudle形式

image.png 具体步骤 1:使用Android studio导入Module image.png 2:在窗口中选择到 ykfsdk的 modlue中,进行下一步导入。 image.png 3:在自己项目app目录下的build.gradle中增加: api project(path: ':ykfsdk')

4:重新 build你的项目。

3、使用音视频功能

如果需求上需要使用到音视频功能,那么在完成以上依赖导入后再添加如下依赖并完成相关代码: 音视频仓库:https://github.com/7moor-tech/video-call-sdk/releases 1:视频依赖库:api 'com.github.7moor-tech:sdk_video_jitsi:1.0.5' 2:项目根目录添加仓库:

allprojects {
    repositories {
        ......
        maven { url "https://raw.githubusercontents.com/7moor-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 image.png

2:创建 KfStartHelper 对象

详细内容代码参考demo中的MainActivity部分

KfStartHelper helper = KfStartHelper.getInstance(_this); 调用配置要使用的服务环境: 目前提供两种方法进行配置: 1:RequestUrl._setRequestBasic(); 腾讯云,阿里云用户只使用setRequestBasic即可 RequestUrl.ALIYUN_REQUEST;//阿里云环境      RequestUrl.TENCENT_REQUEST;//腾讯云环境 2: _RequestUrl.setRequestUrl();注意:

RequestUrl.setRequestUrl()(String http)
    参数说明 http:使用的Http服务

_ 注意: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()(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() 方法 添加: image.png

2:ChatActivity中的beginScheduleSession() 方法 添加: image.png

注意 : 设置扩展信息一定要确保会话是一次全新的会话,即第一次进入会话设置才会有效。

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即可 image.png

离线资源:录音相关的  (点击下载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
  • 删除多余文件,减少体积