# Android sdk集成说明

相关限制及注意事项

1、Android SDK 新版支持 api17 以上版本,支持竖屏和横屏。

2、开发工具AS建议升级到3.0以上版本

3、Android SDK 目前仅仅支持超链接标签,其他html标签和属性均不识别

4、Android SDK 需要申请存储、麦克风、拍照危险权限,否则部分功能无法使用

【注意:安卓系统9.0(api 28)以后,默认不再支持Http请求,需要通过配置network_security_config.xml文件解决。如果您的项目中添加此文件并配置后,智齿SKD2.7.9之前的版本出现突然不能使用的情况,您可使用智齿官网上的最新版本,新版本中我们已优化了该配置的影响。

具体情况可查看详情文档

智齿客服SDK为企业提供了一整套完善的智能客服解决方案。智齿客服 SDK 既包含客服业务逻辑,也提供交互界面;企业只需简单两步,便可在App中集成智齿客服,让App拥有7*24小时客服服务能力。

图片

管理员可以在后台「设置-支持渠道-APP」添加APP,然后按照本接入文档说明完成SDK对接。

智齿客服SDK具有以下特性

  • 在线咨询:咨询机器人、咨询人工客服(收发图片、发送语音)、发送表情;
  • 指定技能组接待;
  • 排队或客服不在线时引导用户留言;
  • 机器人优先模式下隐藏转人工按钮,N次机器人未知问题问题是显现;
  • 客服满意度评价:用户主动满意度评价+用户退出时询问评价;
  • 传入用户资料:用户对接lD+基础资料+自定义字段;
  • 传入商品来源页:来源页标题+来源页URL;
  • 高度自定义UI;

# 1.1 集成流程示意图

图片

# 1.2.文件说明

SDK包含sobotsdkSobot_Sdk_Demo_Android、和Doc相关说明文档。

文件名 说明
ZCSobotApi 该文件提供接入功能
Information 启动配置信息参数类

# 2.1 导入集成

3.1.1版本

普通版:

下载链接:Android_SDK_3.1.1

androidX普通版:

下载链接:Android_SDK_X_3.1.1

电商版:

下载链接:Android_SDK_MALL_3.1.1

androidX电商版:

下载链接:Android_SDK_MALL_X_3.1.1

导入Module

解压下载的智齿Android_SDK_XXX.zip文件,将 sobotsdk 文件直接复制到您的项目中,

然后 Build-->clean projecty一下,之后在build.gradle添加项目依赖

完成上述步骤之后build.gradle中如下所示:

dependencies {
      implementation project(':sobotsdk')
      implementation 'com.squareup.okhttp3:okhttp:4.4.0'
      implementation 'com.android.support:appcompat-v7:28.0.0'
      implementation 'com.android.support:recyclerview-v7:28.0.0'
      //目前支持常见的3种图片加载库,必须在下面的图片加载库中选择一个添加依赖
      //implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
      //implementation 'com.squareup.picasso:picasso:2.5.2'
      implementation 'com.github.bumptech.glide:glide:4.9.0'
      //在使用4.9.0以上版本的glide时,需额外添加依赖,之前的版本不需要
      implementation 'com.sobot.chat:sobotsupport-glidev4:2.1'
}

【注意】由于glide v3版本和v4版本的接口完全不同,因此我们为了方便您的使用,采用了特殊的集成方式使sdk可以支持任意版本的glide。正常情况下,您使用glide 时,直接添加glide依赖和sobotsdk的依赖,sdk即可正常使用。如果报错,那么把glide 升级到4.4.0版本以上即可。

如果项目启动时,出现imageloader或者glide相关引用找不到情况,可以添加以下依赖:

implementation 'com.sobot.chat:sobotsupport-glidev4:2.0'

如果使用的是4.9.0以上版本的glide时,添加以下依赖:

implementation 'com.sobot.chat:sobotsupport-glidev4:2.1'

# 2.2 依赖集成

由于JCenter平台已停止服务,智齿sdk 从2.9.7版本开始依赖库发布到MavenCental()平台。如果您需要对接2.9.7以上版本,需要在您的APP根项目下的build.gradle文件中添加MavenCental的引用

3.1.1版本

// 普通版:
implementation  'com.sobot.chat:sobotsdk:3.1.1'
// 普通版 androidX:
implementation  'com.sobot.chat:sobotsdk_x:3.1.1'

// 电商版:
implementation 'com.sobot.chat:sobotsdk-mall:3.1.1'
// 电商版 androidX:
implementation  'com.sobot.chat:sobotsdk-mall-x:3.1.1'

在build.gradle中如下所示:

dependencies {
      implementation 'com.sobot.chat:sobotsdk:3.1.1'
      implementation 'com.squareup.okhttp3:okhttp:4.4.0'
      implementation 'com.android.support:appcompat-v7:28.0.0'
      implementation 'com.android.support:recyclerview-v7:28.0.0'
      //目前支持常见的3种图片加载库,必须在下面的图片加载库中选择一个添加依赖
      //implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
      //implementation 'com.squareup.picasso:picasso:2.5.2'
      implementation 'com.github.bumptech.glide:glide:4.9.0'
      //在使用4.9.0(包含4.9.0)以上版本的glide时,需额外添加依赖,之前的版本不需要
      implementation 'com.sobot.chat:sobotsupport-glidev4:2.1'
}

【注意】由于glide v3版本和v4版本的接口完全不同,因此我们为了方便您的使用,采用了特殊的集成方式使sdk可以支持任意版本的glide。正常情况下,您使用glide 时,直接添加glide依赖和sobotsdk的依赖,sdk即可正常使用。如果报错,那么把glide 升级到4.4.0版本以上即可。

如果项目启动时,出现imageloader或者glide相关引用找不到情况,可以添加以下依赖:

implementation 'com.sobot.chat:sobotsupport-glidev4:2.0'

*如果使用的是4.9.0(包含4.9.0)以上版本的glide时,添加以下依赖:

implementation 'com.sobot.chat:sobotsupport-glidev4:2.1'

混淆相关:

参照混淆文件(Android_SDK_x.x.x\Sobot_Sdk_Demo_Android\sobotsdkdemo\proguard-rules.pro)中的混淆配置添加混淆规则。

-keep class com.sobot.** {*;}

【注意】为保持移动端两端方法名一致,方便对接,2.8.5版本后SobotApi类改名ZCSobotApi,部分方法名更改,但是原有SobotApi的方法都可继续使用。

# 3.1 域名设置

域名说明:

  • 默认SaaS平台域名为: https://api.sobot.com

  • 如果您是腾讯云服务,请设置为: https://www.soboten.com

  • 如果您是本地化部署,请使用自己的部署的服务域名

示例代码:

【注意:设置域名一定要在所有接口请求之前设置,即在初始化之前就必须设置完】

SobotBaseUrl.setApi_Host("域名");

# 3.2 获取appkey

登录 智齿科技管理平台 获取,如图

图片

# 3.3 初始化

# 3.3.1 普通版

初始化参数和调用方式:

【注意:启动智齿SDK之前,需要调用初始化方法initSobotSDK,否则将无法启动SDK】

接口:

/**
* 初始化sdk
* @param Context applicationcontext 上下文  必填
* @param appkey  用户的appkey  必填 如果是平台版用户需要传总公司的appkey
* @param uid     用户的唯一标识,不能传一样的值,可以为空
*/
ZCSobotApi.initSobotSDK(Context application,String appkey,final String uid);

//2.8.5以前版本方法
SobotApi.initSobotSDK(Context application,String appkey,final String uid);

示例代码:

private void initSobotApp() {  
      ZCSobotApi.initSobotSDK(your application,"your appkey", "");
}

# 3.3.2 电商版

初始化参数和调用方式:

【注意:启动智齿SDK之前,需要调用初始化方法initPlatformUnion和initSobotSDK,否则将无法启动SDK】

接口:

/**
* 初始化平台Id
* @param Context applicationcontext 上下文  必填
* @param platformUnionCode   平台Id  必填  请联系对应的客服申请
* @param platformSecretkey 平台标识 秘钥 请联系对应的客服申请
*/
ZCSobotApi.initPlatformUnion(Context application, String platformUnionCode,String platformSecretkey);

//2.8.5以前版本方法
SobotApi.initPlatformUnion(Context application, String platformUnionCode,String platformSecretkey);

//商户对接id (仅电商版适用,如果没有app_key则必须提供)
//info.setCustomer_code("商户id");

接口(可选):

//设置溢出商城主站公司id
ZCSobotApi.setFlow_Company_Id(context,"your flowCompanyId");
//设置溢出商城主站公司技能组Id
ZCSobotApi.setFlow_GroupId(context,"your flowGroupId");
//设置是否溢出到主商户flowType  0-不溢出 , 1-全部溢出,2-忙碌时溢出,3-不在线时溢出,默认不溢出
ZCSobotApi.setFlow_Type(context,"your flowType");

//2.8.5以前版本方法
SobotApi.setFlow_Company_Id(context,"your flowCompanyId");
SobotApi.setFlow_GroupId(context,"your flowGroupId");
SobotApi.setFlow_Type(context,"your flowType");

示例代码:

    private void initApp() { 
        ZCSobotApi.initSobotSDK(your application, getResources().getString(R.string.sobot_appkey), "");
        // initPlatformUnion()在initSobotSDK()之后调用
        ZCSobotApi.initPlatformUnion(your application, "your platformUnionCode", ""); // platformUnionCode - 平台id
     }

# 3.3.3 权限说明

SDK使用了3个高敏权限(文件存储、麦克风、相机);

3.0.5版本之前版本发送语音消息需要麦克风权限,拍照时需要相机权限,同时还需要文件储存权限。3.0.5版本优化后,录音和录视频的文件都存到沙盒里边,给客服发送语音和拍摄照片视频,不再需要文件存储权限;

加号里边的选取照片和选取视频在andoid10之后 TargetSdkVersion >= 29以上手机不需要文件存储权限,android10 TargetSdkVersion<29以下还需要;

加号里边的拍摄功能是集拍照和录像一体的,所以同时需要麦克风权限和相机权限;

3.0.5版本之后SDK 权限使用情况说明表:

权限 andrid10以上 TargetSdkVersion >= 29 andrid10以下或者 TargetSdkVersion < 29 涉及该权限的功能
文件存储 不需要 需要 给客服发送语音消息 ;加号里边图片、视频 、拍摄 、文件;留言上传图片、视频;
麦克风 需要 需要 给客服发送语音消息 ;加号里边拍摄 ;
相机 需要 需要 加号里边拍摄 ;留言拍照 ;
  • 这些高敏权限只是在上边表中涉及的功能中使用到,使用时动态检测申请,用户同意后才能继续;没有这些高敏权限也不影响sdk的其他功能的正常使用

# 3.4 启动智齿页面

# 3.4.1 启动智齿页面

普通版本和电商版本启动方式一样

接口

Information info = new Information();
//appkey 必传
info.setApp_key("Your appkey");
/**
* @param context 上下文对象
* @param information 初始化参数
*/
ZCSobotApi.openZCChat(context, information);

//2.8.5以前版本方法
SobotApi.startSobotChat(context, information);
参数名 类型 描述
context Context 上下文
information UIViewController 初始化参数自定义设置

示例代码:

Information info = new Information();
// appkey 必填 
info.setApp_key(et_appkey.getText().toString());
//注意:用户唯一标识,不能传入一样的值,选填,最大长度限制为300
info.setPartnerid("");
//用户昵称,选填
info.setUser_nick("");
//用户姓名,选填
info.setUser_name("");
//用户电话,选填
info.setUser_tels("");
//用户邮箱,选填
info.setUser_emails("");
//自定义头像,选填
info.setFace("");
//用户QQ,选填
info.setQq("");
//用户备注,选填
info.setRemark("");
//访问着陆页标题,选填
info.setVisit_title("");
//访问着陆页链接地址,选填
info.setVisit_url("");
ZCSobotApi.openZCChat(context, info);

如有特殊需求,SDK 还提供了以 fragment 嵌入的方式集成会话界面,开发者可以更灵活的使用 SDK。示例代码如下(也可参考SobotChatActivity中的实现)

Bundle informationBundle = new Bundle();
informationBundle.putSerializable(ZhiChiConstant.SOBOT_BUNDLE_INFO, info);
SobotChatFragment fragment = SobotChatFragment.newInstance(informationBundle);
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
// containerId 为 ViewGroup 的 resId
transaction.replace(containerId, fragment);
try {
    transaction.commitAllowingStateLoss();
} catch (Exception e) {
}

# 3.4.2 启动商家列表(仅电商版)

/**
 * 启动商家列表
 *
 * @param context 上下文对象
 * @param uid 用户唯一标识 与information中传的uid一致
 */
ZCSobotApi.openZCChatListView(Context context,String uid);

//2.8.5以前版本方法
SobotApi.startMsgCenter(Context context,String uid)

设置消息中心item回调

SobotOption.sobotConversationListCallback = new SobotConversationListCallback(){
   @Override
   public void onConversationInit(Context context,Information info) {
      //点击会话列表中的单个会话,启动聊天页面
     //由于默认的启动方式无法获取客服聊天的配置,因此需要手动设置此回调
     /**
      *例如:
      *  //用户昵称,选填
      *  info.setUser_nick("");
      *  .....
      *  ZCSobotApi.openZCChat(context, info);
      **/
   }
};

# 3.4.3 启动客户服务中心

Information info = new Information();
info.setApp_key("Your AppKey");  //分配给App的的密钥

//2.9.3新增客服中心电话按钮,电话号码和显示文案都不为空才能显示
info.setHelpCenterTel("18510000000");//电话号码
info.setHelpCenterTelTitle("联系电话");//打电话按钮显示文案

/**
* @param context 上下文对象
* @param information 初始化参数
*/
ZCSobotApi.openZCServiceCenter(context, information);

//2.8.5以前版本方法
SobotApi.openSobotHelpCenter(context, information);

效果图如下:

图片

# 3.5 结束会话

用户在应用中退出登陆时需要调用 SDK 的注销操作(只在切换账号时调用),该操作会通知服务器进行推送信息的解绑,避免用户已退出但推送依然发送到当前设备的情况发生。当用于用户退出登录时调用以下方法:

注意:调用此方法会造成通道连接断开,此时用户将无法收到消息。

/**
* @param context 上下文对象
*/
ZCSobotApi.outCurrentUserZCLibInfo(context);

//2.8.5以前版本方法
SobotApi.exitSobotChat(context);

# 4.1 机器人客服

# 4.1.1 对接指定机器人

在后台获取机器人编号:

图片

在 SDK 代码中配置:

//设置机器人编号
info.setRobotCode("your robot code");

//设置机器人编号对应的别名  2.8.6新增
//指定别名和指定的编号id效果一样
info.setRobot_alias("your robot alias");

# 4.1.2 自定义接入模式

根据自身业务的需要,可进行以下初始化参数配置,控制接入模式:

//默认false:显示转人工按钮。true:智能转人工
info.setArtificialIntelligence(false);
//当未知问题或者向导问题显示超过(X)次时,显示转人工按钮。
//注意:只有ArtificialIntelligence参数为true时起作用
info.setArtificialIntelligenceNum(X);
//是否使用语音功能 true使用 false不使用   默认为true
info.setUseVoice(true);
//是否使用机器人语音功能 true使用 false不使用 默认为false,需要付费才可以使用
info.setUseRobotVoice(false);
//客服模式控制 -1不控制 按照服务器后台设置的模式运行
//1仅机器人 2仅人工 3机器人优先 4人工优先
info.setService_mode(-1);
//设置机器人模式下输入关键字转人工
HashSet<String> tmpSet = new HashSet<>();
tmpSet.add("转人工");
tmpSet.add("人工");
info.setTransferKeyWord(tmpSet);

# 4.1.3 自定义转人工事件

sdk可以配置转人工拦截器,在转人工前做一些额外的逻辑处理,例如自定义技能组选择dialog。

1.设置拦截器

SobotOption.transferOperatorInterceptor = new SobotTransferOperatorInterceptor() {
    @Override
    public void onTransferStart(final Context context, final SobotTransferOperatorParam param) {
        //do something
    }
};

2、修改转人工参数SobotTransferOperatorParam,以下为可修改参数介绍:

//技能组id 
String groupId;
//技能组名称
String groupName;
//转人工后是否提示
boolean isShowTips;
//商品卡片信息
ConsultingContent consultingContent;

3、使用转人工参数主动调用转人工接口:

/**
 * 外部主动调用转人工
 * @param context
 * @param param 转人工参数
 *        ConsultingContent consultingContent 商品信息        
 */
ZCSobotApi.connectCustomerService(context, param);

//2.8.5以前版本方法
SobotApi.transfer2Operator(context, param);

# 4.1.4 设置转人工溢出

注意:如果设置了指定客服或者指定技能组接待,则溢出配置不生效。

1.配置参数对象示例

Information info = new Information();
//设置溢出技能组或客服,最多四层,
List<SobotTransferAction> datas = new ArrayList<>();
//例如:设置专员客服接待;溢出规则和技能组一样
SobotTransferAction firstData = new SobotTransferAction.ServiceBuilder()
        .conditionIntelligentudgement()
        .overflow()
        .designatedServiceId("d679e5b8d45b484e9475a2ca051b44a0")//专员客服ID
        .ServiceBuilder();
//例如:贵宾技能组
SobotTransferAction guibinData = new SobotTransferAction.Builder()
        .designatedSkillId("ae654754311e4fa59sdfdsafdsffc")
        .conditionIntelligentudgement()
        .overflow()
        .Build();

//例如:vip技能组
SobotTransferAction vipData = new SobotTransferAction.Builder()
        .designatedSkillId("ae654754311e4fa590b0e3a4298672fc")
        .conditionIntelligentudgement()
        .overflow()
        .Build();
//例如:普通技能组
SobotTransferAction data = new SobotTransferAction.Builder()
        .designatedSkillId("a71100c5463d42bfb467762bccfef511")
        .conditionIntelligentudgement()
        .overflow()
        .Build();
datas.add(firstData);
datas.add(guibinData);
datas.add(vipData);
datas.add(data);
JSONArray jsonArray = GsonUtil.praseList2Json(datas);
info.setTransferAction(jsonArray.toString());

2.配置参数说明

①、设置是否溢出
//设置溢出
overflow()
//设置不溢出
no_overflow()
②、设置指定的技能组
designatedSkillId("技能组id")
   设置指定的客服
designatedServiceId("客服id")


③、设置溢出条件
//指定客服组时:技能组无客服在线
conditionServiceOffline()
//指定客服组时:技能组所有客服忙碌
conditionServiceBusy()
//指定客服组时:技能组不上班
conditionServiceOffWork()
//指定客服组时:智能判断
conditionIntelligentudgement()

# 4.1.5 机器人咨询模式下可隐藏加号菜单栏的按钮

//隐藏留言功能,人工和机器人模式下都会隐藏 true 隐藏,false 显示,默认false
info.setHideMenuLeave(true);
//隐藏评价功能 true 隐藏,false 显示,默认false 
info.setHideMenuSatisfaction(true);

# 4.1.6 指定常见问题引导

//2.9.2 新增 不同场景进入可以配置faqid指定机器人对应的常见问题引导
  info.setFaqId("robot faqid");

# 4.2 人工客服

# 4.2.1 对接指定技能组

在后台获取技能组编号:

图片

在 SDK 代码中配置技能组ID:

//预设技能组编号
info.setGroupid("your groupId");
//预设技能组名称,选填
info.setGroup_name("your groupName");

注意:此字段可选,如果传入技能组ID那么SDK内部转人工之后不在弹技能组的选择框,直接跳转到传入ID所对应的技能组中

# 4.2.2 对接指定客服

在后台获取指定客服ID:

图片

图片

在 SDK 代码中设置:

//转接类型(0-可转入其他客服,1-必须转入指定客服)
info.setTranReceptionistFlag(1);
//指定客服id
info.setChoose_adminid("your Customer service id");

注意: 1 choose_adminid :指定对接的客服,如果不设置,取默认

2 tranReceptionistFlag :设置指定客服之后是否必须转入指定客服

0 :可转入其他客服,

1: 必须转入指定客服,

注意:如果设置为1 ,当指定的客服不在线,不能再转接到其他客服

# 4.2.3 设置用户自定义资料和自定义字段

开发者可以直接传入这些用户信息,供客服查看。

在工作台自行配置所需要显示的字段,配置方法如下图:

图片

//设置用户自定义字段,key必须是后端字段对应的ID
Map<String,String> customerFields = new HashMap<>();
customerFields.put("weixin","your wechat");
customerFields.put("weibo","your weibo");
customerFields.put("sex","女");
customerFields.put("birthday","2017-05-17");
info.setCustomer_fields(customerFields);

用户自定义资料

//自定义用户料
Map<String, String> customInfo = new HashMap<>();
customInfo.put("资料", "aaaaa");
info.setParams(customInfo);

效果图如下: 图片

# 4.2.4 设置转接成功后自动发消息

sdk可以设置转接成功后自动发消息,每通会话只会发送一次; (2.9.3新增)可设置是否每次进入聊天页面都自动发送一次,默认只发送一次;

//发送文字消息
//设置发送模式 
//SobotAutoSendMsgMode.Default  默认 不发送
//SobotAutoSendMsgMode.SendToRobot  只给机器人发送
//SobotAutoSendMsgMode.SendToOperator   只给人工客服发送
//SobotAutoSendMsgMode.SendToAll   全部发送
//setIsEveryTimeAutoSend 是否每次进入聊天页都发送
info.setAutoSendMsgMode(SobotAutoSendMsgMode.SendToAll.setContent("your msg").setIsEveryTimeAutoSend(false));

//2.8.6 新增转人工成功后可发送文字、图片、视频、文件(只限人工模式下),需要设置文件本地路径和发送类型
//SobotAutoSendMsgMode.ZCMessageTypeText   文本(默认)
//SobotAutoSendMsgMode.ZCMessageTypePhoto  图片
//SobotAutoSendMsgMode.ZCMessageTypeFile   文件
//SobotAutoSendMsgMode.ZCMessageTypeVideo  视频
String path = CommonUtils.getSDCardRootPath() + File.separator + "2.jpg";
//path =  "发送内容";
//path =  CommonUtils.getSDCardRootPath() + File.separator + "3.mp4";
//path = CommonUtils.getSDCardRootPath() + File.separator + "1.txt";
info.setAutoSendMsgMode(SobotAutoSendMsgMode.SendToOperator.setContent(path).setAuto_send_msgtype(SobotAutoSendMsgMode.ZCMessageTypePhoto));

# 4.2.5 设置指定客户排队优先接入

sdk可以设置当前用户排队优先,当此用户进入排队状态时,将会被优先接待。

//设置排队优先接入 true:优先接入  false:默认值,正常排队
info.setIs_Queue_First(true);

# 4.2.6 设置服务总结自定义字段

sdk可以配置服务总结自定义字段,可以使客服更快速的对会话进行服务总结。

1、获取自定义字段id

图片

图片

2、设置服务总结自定义字段 (转人工支持传入服务总结参数)

//服务总结自定义字段
Map<String, String> summaryInfo = new HashMap<>();
summaryInfo.put("your keyId", "your value");
info.setSummary_params(summaryInfo);

# 4.2.7 设置多轮会话接口参数

在使用多轮会话功能时,每一个接口我们都会传入 uid 和 mulitParams 两个固定的自定义参数,uid 是用户的唯一标识,mulitParams是自定义字段json字符串、如果用户对接了这两个字段,我们会将这两个字段回传给第三方接口、如果没有我们会传入空字段。

//多轮会话自定义参数
info.setMulti_params("{\"key1\",\"val1\"}");

# 4.2.8 商品的咨询信息并支持直接发送消息卡片,仅人工模式下支持

在用户与客服对话时,经常需要将如咨询商品或订单发送给客服以便客服查看。咨询对象目前最多支持发送5个属性(title,imgUrl,fromUrl,describe,lable),其中(title,fromUrl)为必填字段,如下以商品举例说明:
//咨询内容
ConsultingContent consultingContent = new ConsultingContent();
//咨询内容标题,必填
consultingContent.setSobotGoodsTitle("XXX超级电视50英寸2D智能LED黑色");
//咨询内容图片,选填 但必须是图片地址
consultingContent.setSobotGoodsImgUrl("http://www.li7.jpg");
//咨询来源页,必填
consultingContent.setSobotGoodsFromUrl("www.sobot.com");
//描述,选填
consultingContent.setSobotGoodsDescribe("XXX超级电视 S5");
//标签,选填
consultingContent.setSobotGoodsLable("¥2150");
//转人工后是否自动发送
consultingContent.setAutoSend(true);
//3.0.3新增 每次返回再次进入聊天页面是否都重新发送 true 每次都发,false 只发一次,默认只发一次 
consultingContent.setEveryTimeAutoSend(false);
//启动智齿客服页面 在Information 添加,转人工发送卡片消息
info.setConsultingContent(consultingContent);

效果图如下: 图片

# 4.2.9 发送订单卡片,仅人工模式下支持,订单卡片点击事件可拦截

用法一:启动智齿客服时,自动发送订单卡片消息

List<OrderCardContentModel.Goods> goodsList = new ArrayList<>();
goodsList.add(new OrderCardContentModel.Goods("苹果", "https://img.sobot.com/chatres/66a522ea3ef944a98af45bac09220861/msg/20190930/7d938872592345caa77eb261b4581509.png"));
goodsList.add(new OrderCardContentModel.Goods("苹果1111111", "https://img.sobot.com/chatres/66a522ea3ef944a98af45bac09220861/msg/20190930/7d938872592345caa77eb261b4581509.png"));
goodsList.add(new OrderCardContentModel.Goods("苹果2222", "https://img.sobot.com/chatres/66a522ea3ef944a98af45bac09220861/msg/20190930/7d938872592345caa77eb261b4581509.png"));
goodsList.add(new OrderCardContentModel.Goods("苹果33333333", "https://img.sobot.com/chatres/66a522ea3ef944a98af45bac09220861/msg/20190930/7d938872592345caa77eb261b4581509.png"));
OrderCardContentModel orderCardContent = new OrderCardContentModel();
//订单编号(必填)
orderCardContent.setOrderCode("zc32525235425");
//订单状态
//待付款:1 待发货:2 运输中:3  派送中:4  已完成:5  待评价:6 已取消:7
orderCardContent.setOrderStatus(1);

//2.9.7版本新增自定义订单状态名称 只有订单状态是0时才有效,其他值还按照原有逻辑
//orderCardContent.setOrderStatus(0);
//orderCardContent.setStatusCustom("您的自定义状态");                 

//订单总金额(单位 分)
orderCardContent.setTotalFee(1234);
//订单商品总数
orderCardContent.setGoodsCount("4");
//订单链接
orderCardContent.setOrderUrl("https://item.jd.com/1765513297.html");
//订单创建时间
orderCardContent.setCreateTime(System.currentTimeMillis() + "");
//转人工后是否自动发送
orderCardContent.setAutoSend(true);
//3.0.3新增 每次返回再次进入聊天页面是否都重新发送 true 每次都发,false 只发一次,默认只发一次 
orderCardContent.setEveryTimeAutoSend(false);
//订单商品集合
orderCardContent.setGoods(goodsList);
//订单卡片内容
info.setOrderGoodsInfo(orderCardContent);

用法二:转人工后,加号中可添加一个订单按钮,点击后给客服发送一条订单消息

final String ACTION_SEND_ORDERCARD = "sobot_action_send_ordercard";
ChattingPanelUploadView.SobotPlusEntity ordercardEntity = new ChattingPanelUploadView.SobotPlusEntity(ResourceUtils.getDrawableId(getApplicationContext(), "sobot_ordercard_btn_selector"), ResourceUtils.getResString(getApplicationContext(), "sobot_ordercard"), ACTION_SEND_ORDERCARD);
tmpList.add(ordercardEntity);
SobotUIConfig.pulsMenu.operatorMenus = tmpList;
//sSobotPlusMenuListener 只能有一个,否则,下边的会覆盖上边的(例如:加号中
//同时自定义添加位置和订单按钮后,可根据action 判断点击的是哪个按钮,做对应的处理)
SobotUIConfig.pulsMenu.sSobotPlusMenuListener = new SobotPlusMenuListener() {
    @Override
    public void onClick(View view, String action) {
        if (ACTION_SEND_ORDERCARD.equals(action)) {
            Context context = view.getContext();
            List<OrderCardContentModel.Goods> goodsList = new ArrayList<>();
            goodsList.add(new OrderCardContentModel.Goods("苹果", "https://img.sobot.com/chatres/66a522ea3ef944a98af45bac09220861/msg/20190930/7d938872592345caa77eb261b4581509.png"));
            OrderCardContentModel orderCardContent = new OrderCardContentModel();
            //订单编号(必填)
            orderCardContent.setOrderCode("zc32525235425");
            //订单状态
            //待付款:1 待发货:2 运输中:3 派送中:4 已完成:5 待评价:6 已取消:7
            orderCardContent.setOrderStatus(1);

            //2.9.7版本新增自定义订单状态名称 只有订单状态是0时才有效,其他值还按照原有逻辑
            //orderCardContent.setOrderStatus(0);
            //orderCardContent.setStatusCustom("您的自定义状态");   

            //订单总金额(单位是分)
            orderCardContent.setTotalFee(1234);
            //订单商品总数
            orderCardContent.setGoodsCount("4");
            //订单链接
            orderCardContent.setOrderUrl("https://item.jd.com/1765513297.html");
            //订单创建时间
            orderCardContent.setCreateTime(System.currentTimeMillis() + "");
            //订单商品集合
            orderCardContent.setGoods(goodsList);
            ZCSobotApi.sendOrderGoodsInfo(context, orderCardContent);
        }
    }
};

配置订单卡片拦截,也可使用ZCSobotApi.setNewHyperlinkListener()进行拦截;setOrderCardListene拦截后setNewHyperlinkListener就不会在拦截了

ZCSobotApi.setOrderCardListener(new SobotOrderCardListener() {
    @Override
    public void onClickOrderCradMsg(OrderCardContentModel orderCardContent) {
        ToastUtil.showToast(getApplicationContext(), "点击了订单卡片" );
    }
});

效果图如下: 图片

# 4.2.10 查看商户客服是否正在和用户聊天 (仅电商版可用)

/**
 * 判断当前用户是否正在与当前商户客服聊天
 *
 * @param appkey 当前商户的appkey
 * @return true 表示正在与当前商户客服聊天
 *           false 表示当前没有与所选商户客服聊天
 */
ZCSobotApi.isActiveOperator(appkey);

# 4.2.11 设置用户是否是vip和用户vip级别

//可在启动智齿客服时设置
//指定客户是否为vip,0:普通 1:vip
 info.setIsVip("1");
//vip级别可在智齿管理端(系统设置>自定义字段>客户字段)中编辑,拿到等级对应的ID或者名称
 info.setVip_level("尊贵");//通过名称设置vip等级

# 4.2.12 设置用户自定义标签

//可在启动智齿客服时设置
//用户标签可在智齿管理端(系统设置>自定义字段>客户字段)中编辑,拿到用户标签对应的ID或者名称
//可添加多个用户标签,多个标签ID或者名称之间用,分割
info.setUser_label("明星,记者");

# 4.2.13 转人工后可隐藏“+”号菜单栏中的按钮

//隐藏留言功能,人工和机器人模式下都会隐藏 true 隐藏,false 显示,默认false
info.setHideMenuLeave(true);
//隐藏留言功能,只有人工模式下会隐藏 true 隐藏,false 显示,默认false
info.setHideMenuManualLeave(true);
//隐藏评价功能 true 隐藏,false 显示,默认false
info.setHideMenuSatisfaction(true);
//隐藏图片功能 true 隐藏,false 显示,默认false
info.setHideMenuPicture(true);
//隐藏视频功能 true 隐藏,false 显示,默认false
info.setHideMenuVedio(true);
//隐藏文件功能 true 隐藏,false 显示,默认false
info.setHideMenuFile(true);
//隐藏拍摄功能 true 隐藏,false 显示,默认false
info.setHideMenuCamera(true);

# 4.3 留言工单相关

# 4.3.1 工作台设置留言界面

在工作台可以设置留言界面

图片

# 4.3.2 留言页面用户信息自定义配置

留言中的邮箱、电话、附件这三个参数的校验和显示逻辑可在pc端console页面配置。

图片

# 4.3.3 跳转到留言页面

/**
 * 跳转到留言界面
 *
 * @param context   上下文  必填
 * @param info     用户的appkey  必填 如果是平台用户需要传总公司的appkey
 * @param isOnlyShowTicket true只显示留言记录界面,false 请您留言和留言记录界面都显示
 */
 ZCSobotApi.openLeave(Context context,Information info,boolean isOnlyShowTicket);

//2.8.5以前版本方法
SobotApi.startToPostMsgActivty(Context context,Information info,boolean isOnlyShowTicket);

示例代码:

Information info = new Information();
info.setApp_key(et_appkey.getText().toString());/* 必填 */
//工单技能组
info.setLeaveMsgGroupId("6576d173af904d97b1d5d01a11cc66f5");
Map<String,String> map=new HashMap<>();
//自定义字段,key和后端添加字段ID的对应
map.put("834b34870b2e47daa1904d8f63ee55c2","zzz");
info.setLeaveCusFieldMap(map);
//2.9.5添加 指定留言模版id,跳转到指定的留言界面
info.setLeaveTemplateId("7800560a37784ce1be064915c8389d28");
ZCSobotApi.openLeave(SobotStartActivity.this, info, false);

# 4.3.4 留言页面事件拦截

sdk中留言可跳转到自定义页面,如有此需求,可以使用如下方法进行设置:

ZCSobotApi.setSobotLeaveMsgListener(new SobotLeaveMsgListener() {
    @Override
    public void onLeaveMsg() {
      ToastUtil.showToast(getApplicationContext(),"在这里实现方法,跳转页面");
   }
});

# 4.3.5 已完成状态的留言详情界面的回复按钮可通过参数配置是否显示

//已完成状态的留言,是否可持续回复 true 持续回复 ,false 不可继续回复 ;
//默认 true 用户可一直持续回复
ZCSobotApi.setSwitchMarkStatus(MarkConfig.LEAVE_COMPLETE_CAN_REPLY,true);

# 4.3.6 获取留言回复

  /**
   * 获取未读留言回复列表,如果获取到有未读的留言回复,把最新的一条展示在通知栏中,点击通知栏通知,跳转到留言详情页面
   *
   *如果您通过类似定时任务的方式实时获取最新的留言回复,两次请求间隔时间需大于60s,接口才会有数据返回
   *
   * @param context   上下文  必填
   * @param partnerId 用户唯一标识 与information中传的partnerId一致
   * @param noReadLeaveReplyListener 获取未读留言回复列表回调,SobotLeaveReplyModel:单个留言回复对象
   */
 ZCSobotApi.getLastLeaveReplyMessage(SobotStartActivity.this,"your partnerid", new SobotNoReadLeaveReplyListener() {
                @Override
                public void onNoReadLeaveReplyListener(List<SobotLeaveReplyModel> sobotLeaveReplyModelList) {
                    if(sobotLeaveReplyModelList!=null&&sobotLeaveReplyModelList.size()>0){
                    // 发送留言回复通知,点击通知栏通知后,跳转到留言详情页面
                    ZCSobotApi.sendLeaveReplyNotification(SobotStartActivity.this, sobotLeaveReplyModelList.get(0), R.drawable.sobot_logo_small_icon, R.drawable.sobot_logo_small_icon);
                    }
                
                }
            });

# 4.3.7 添加留言评价主动提醒开关

//已完成留言详情界面-未评价:返回时是否弹出服务评价窗口(只会第一次返回弹,下次返回不会再弹) 默认false(不弹)
info.setShowLeaveDetailBackEvaluate(true);

# 4.3.8 添加留言扩展参数

 //添加留言对接字段
 List<SobotLeaveMsgFieldModel> leaveParamsExtends = new ArrayList<>();
//SobotLeaveMsgFieldModel属性说明;id:对接字段系统自动生成的id;value:传递的数据;params:显示的字段ID,例如city、address,与id对应;数据从后端工作台配置得到
 leaveParamsExtends.add(new SobotLeaveMsgFieldModel("your id", "your value", "your params"));
 info.setLeaveParamsExtends(leaveParamsExtends);

 //添加留言技能组
info.setLeaveMsgGroupId("your groupId");

//添加留言自定义字段,key和后端添加字段ID的对应
Map<String,String> map=new HashMap<>();
map.put("your field key","zzz");
info.setLeaveCusFieldMap(map);

# 4.4 评价

# 4.4.1 设置评价界面

在工作台可以设置 满意度评价界面

图片

# 4.4.2 导航栏左侧点击返回时是否弹出满意度评价

注意:只有用户发送过消息,满意度评价窗口才能弹出

//点击返回时是否弹出弹窗(您是否结束会话?)
info.setShowLeftBackPop(true);
//导航栏左侧点击返回时是否弹出满意度评价。true弹出,false不弹;默认false
info.setShowSatisfaction(false);

效果图如下: 图片图片

# 4.4.3 导航栏右侧关闭按钮是否显示和点击时是否弹出满意度评价

注意:只有用户发送过消息,满意度评价窗口才能弹出

//设置是否显示导航栏右侧关闭按钮,true显示,false隐藏;默认false
info.setShowCloseBtn(false);
//导航栏右侧点击关闭按钮时是否弹出满意度评价。true弹出,false不弹;默认false
info.setShowCloseSatisfaction(false);

# 4.4.4 配置用户提交人工满意度评价后释放会话

/**
 * 配置用户提交人工满意度评价后释放会话
 * @param context 上下文对象
 * @param flag true 表示释放会话  false  表示不释放会话
 */
ZCSobotApi.setEvaluationCompletedExit(context,flag);

# 4.4.5 左上角返回和右上角关闭时,人工满意度评价弹窗界面配置是否显示暂不评价按钮

/**
 * 左上角返回和右上角关闭 返回弹出评价窗口时,是否显示暂不评价按钮  默认false(不显示)
 */
info.setCanBackWithNotEvaluation(true);

# 4.5 消息相关

# 4.5.1 发送文本消息

如您的app需要主动发送文本消息给客服,请使用如下代码:

/**
 * 发送文本类信息
 * @param context
 * @param content 文本内容
 */
ZCSobotApi.sendTextToUser(Context context,String content)

//2.8.5以前版本方法
SobotApi.sendTextMsg(Context context,String content)

# 4.5.2 设置是否开启消息提醒

当用户不处在聊天界面时,收到客服的消息,APP 可以在通知栏或者聊天入口给出提醒。通知栏提醒可以显示最近一条消息的内容,并提供给用户快速进入 APP 的入口。

/**
* 设置是否开启消息提醒 默认不提醒
* @param context
* @param flag
* @param smallIcon 小图标的id 设置通知栏中的小图片,尺寸一般建议在24×24
* @param largeIcon 大图标的id
*/
public static void setNotificationFlag(Context context,boolean flag,int smallIcon,int largeIcon);

用户点击通知栏会发出广播,监听广播实现跳转到指定Activity

action:
常量:ZhiChiConstant.SOBOT_NOTIFICATION_CLICK
或者字符串:“sobot_notification_click”

//在接收到广播的地方,用户可以自己处理点击事件;
//也可以获取当前启动的参数对象Information,直接启动智齿聊天,参考代码如下:
Information information = ZCSobotApi.getCurrentInfoSetting(context);
if (information != null) {
    ZCSobotApi.openZCChat(context, information);
}

示例代码:

//设置是否开启消息提醒
ZCSobotApi.setNotificationFlag(getApplicationContext(), true, R.drawable.sobot_logo_small_icon, R.drawable.sobot_logo_icon);

# 4.5.3 设置离线消息

开启离线消息

// 开启通道接受离线消息,开启后会将消息以广播的形式发送过来,如果无需此功能那么可以不做调用
ZCSobotApi.checkIMConnected(getApplicationContext(), "uid");

//2.8.5以前版本方法
SobotApi.initSobotChannel(getApplicationContext(), "uid");

关闭离线消息

// 关闭通道,清除当前会话缓存
ZCSobotApi.closeIMConnection(getApplicationContext());

//2.8.5以前版本方法
SobotApi.disSobotChannel(getApplicationContext());

# 4.5.4 注册广播、获取新收到的信息和未读消息数

注册广播后,当消息通道连通时,可以获取到新接收到的消息。

1 注册广播

/**
* action:ZhiChiConstants.sobot_unreadCountBrocast
*/
IntentFilter filter = new IntentFilter();
filter.addAction(ZhiChiConstant.sobot_unreadCountBrocast);
contex.registerReceiver(receiver, filter);

2 接收新信息和未读消息数 在BroadcastReceiver的onReceive方法中接收信息。

public class MyReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    //未读消息数
    int noReadNum = intent.getIntExtra("noReadCount", 0);
    //新消息内容
    String content = intent.getStringExtra("content");
    Bundle bundle = intent.getExtras();
    ZhiChiPushMessage message = (ZhiChiPushMessage) bundle.get("sobotMessage");
    LogUtils.i(" 未读消息数:" + noReadNum + "   新消息内容:" + content);
    LogUtils.i(" 消息对象:" + message.toString());
    unread_msg_num.setText(noReadNum + "");
  }
}

当用户不处在聊天界面时,收到客服的消息会将未读消息数保存在本地,如果需要获取本地保存的未读消息数,那么在需要的地方调用该方法即可。如下:

/**
* @param context 上下文对象
* @param uid 用户唯一标识 与information中传的uid一致,
* @return int
*/
ZCSobotApi.getUnReadMessage(Context context,String uid);//如果您没有在information里设置这个uid,请传入null。

//2.8.5以前版本方法
SobotApi.getUnreadMsg(Context context,String uid);

# 4.5.5 发送位置消息

如您的app需要发送客户的位置信息,请参照以下步骤设置(其中地图定位需要开发者自行开发):

1、客服聊天界面配置位置发送按钮(显示在点击“+”按钮的菜单面板中,只在转人工后显示),代码如下:

//菜单动作 当点击按钮时会将对应action返回给callback以此作为依据,
//判断用户点击了哪个按钮,可自行定义
final String ACTION_LOCATION = "sobot_action_location";
//配置位置发送按钮
ChattingPanelUploadView.SobotPlusEntity locationEntity = new ChattingPanelUploadView.SobotPlusEntity(R.drawable.sobot_location_btn_selector, ResourceUtils.getResString(getApplicationContext(), "sobot_location"), ACTION_LOCATION);
List<ChattingPanelUploadView.SobotPlusEntity> tmpList = new ArrayList<>();
tmpList.add(locationEntity);
SobotUIConfig.pulsMenu.operatorMenus = tmpList;

2、设置位置发送按钮的回调:

//sSobotPlusMenuListener 只能有一个,否则,下边的会覆盖上边的(例如:加号中
//同时自定义添加位置和订单按钮后,可根据action 判断点击的是哪个按钮,做对应的处理)
SobotUIConfig.pulsMenu.sSobotPlusMenuListener = new SobotPlusMenuListener() {
    @Override
    public void onClick(View view, String action) {
        if (ACTION_LOCATION.equals(action)) {
            Context context = view.getContext();
            //在地图定位页面获取位置信息后发送给客服:
            SobotLocationModel locationData = new SobotLocationModel();
            //地图快照,必须传入本地图片地址,注意:如果不传会显示默认的地图图片
            locationData.setSnapshot(Environment.getExternalStorageDirectory().getAbsolutePath()  +"/1.png");
            //纬度
            locationData.setLat("40.057406655722");
            //经度
            locationData.setLng("116.2964407172");
            //标点名称
            locationData.setLocalName("金码大厦");
            //标点地址
            locationData.setLocalLabel("北京市海淀区六道口金码大厦");
            ZCSobotApi.sendLocation(context, locationData);
        }
    }
};

# 4.5.6 自定义超链接的点击事件(拦截范围:帮助中心、留言、聊天、留言记录、商品卡片,订单卡片,位置卡片)

2.8.2 之后

// 链接的点击事件, 根据返回结果判断是否拦截 如果返回true,拦截;false 不拦截
// 可为订单号,商品详情地址等等;客户可自定义规则拦截,返回true时会把自定义的信息返回
// 拦截范围  (帮助中心、留言、聊天、留言记录、商品卡片,订单卡片)
ZCSobotApi.setNewHyperlinkListener(new NewHyperlinkListener() {
    @Override
    public boolean onUrlClick(String url) {
        //举例
        if (url.contains("baidu.com")) {
            ToastUtil.showToast(getApplicationContext(), "点击了超链接,url=" + url);
            //如果url链接是百度,拦截
            //do().....
            return true;
        }
        //举例
        if (url.contains("订单编号:123456789")) {
            ToastUtil.showToast(getApplicationContext(), "点击了超链接,url=" + url);
            //如果链接是订单卡片,拦截
            //do().....
            return true;
        }
        return false;
    }
    @Override
    public boolean onEmailClick(String email) {
        ToastUtil.showToast(getApplicationContext(), "点击了邮件,email=" + email);
        return false;
    }
    @Override
    public boolean onPhoneClick(String phone) {
        ToastUtil.showToast(getApplicationContext(), "点击了电话,phone=" + phone);
        return false;
    }
});

设置位置卡片点击事件回调 (2.9.3新增)

  //位置卡片点击后默认优先打开百度地图,没有安装百度地图,再打开高德地图;可拦截位置卡片点击事件,自己处理
        SobotOption.mapCardListener = new SobotMapCardListener() {
            @Override
            public boolean onClickMapCradMsg(Context context, SobotLocationModel locationModel) {
                if (context != null && locationModel != null) {
                    ToastUtil.showCustomToast(context, "点击拦截位置卡片事件");
                    //优先打开高德地图
                    //StMapOpenHelper.firstOpenGaodeMap(context, locationModel);
                    //优先打开百度地图
                    //StMapOpenHelper.firstOpenBaiduMap(context, locationModel);
                }
                return true;//返回true 拦截
               // return false;//返回false 不拦截
            }
        };

2.8.2 之前 这个方法 配置后会拦截所有的,不能动态拦截,建议使用新方法(setNewHyperlinkListener)

ZCSobotApi.setHyperlinkListener(new HyperlinkListener() {
  @Override
  public void onUrlClick(String url) {
    LogUtils.i("点击了超链接,url="+url);
  }
  @Override
  public void onEmailClick(String email) {
    LogUtils.i("点击了邮件,email="+email);
  }
  @Override
  public void onPhoneClick(String phone) {
    LogUtils.i("点击了电话,phone="+phone);
  }
});

# 4.5.7 监听当前聊天模式的变化

ZCSobotApi.setChatStatusListener(new SobotChatStatusListener() {
    @Override
    public void onChatStatusListener(SobotChatStatusMode chatStatusMode) {
        switch (chatStatusMode) {
            case ZCServerConnectRobot:
                ToastUtil.showToast(getApplicationContext(), "机器人聊天模式");
                break;
            case ZCServerConnectArtificial:
                ToastUtil.showToast(getApplicationContext(), "转人工客服聊天模式");
                break;
            case ZCServerConnectOffline:
                ToastUtil.showToast(getApplicationContext(), "已离线");
                break;
            case ZCServerConnectWaiting:
                ToastUtil.showToast(getApplicationContext(), "仅人工排队中");
                break;
        }
    }
});

# 4.5.8 替换消息中手机或固话识别的正则表达式

ZCSobotApi.replacePhoneNumberPattern(String regex);

# 4.5.9 替换消息中超链接识别的正则表达式

ZCSobotApi.replaceWebUrlPattern(String regex);

# 4.5.10 隐藏消息列表中的时间提示

//isHide true 隐藏 ,false 显示 默认false
ZCSobotApi.hideTimemsgForMessageList( Context context, boolean isHide);

# 4.6 会话页面自定义UI设置

为了咨询客服窗口的界面风格能与集成智齿客服 SDK 的 App 整体统一,智齿客服 SDK 提供了简洁的 UI 自定义配置选项

# 4.6.1 配置属性值

以下属性可在application的oncreate()方法中设置

//设置 转人工按钮的图片
SobotUIConfig.sobot_serviceImgId = R.drawable.sobot_icon_manualwork_normal;
//设置 头部文字字体颜色
SobotUIConfig.sobot_titleTextColor = R.color.sobot_color;
//设置 右上角按钮图片
SobotUIConfig.sobot_moreBtnImgId = R.drawable.sobot_delete_hismsg_normal;
//设置 头部背景颜色
SobotUIConfig.sobot_titleBgColor = R.color.sobot_white;
//修改状态栏背景颜色
SobotUIConfig.sobot_statusbar_BgColor = R.color.sobot_white;
//设置 聊天界面底部整体布局背景颜色
SobotUIConfig.sobot_chat_bottom_bgColor = R.color.sobot_white;
//设置 聊天界面左边气泡背景颜色
SobotUIConfig.sobot_chat_left_bgColor = R.color.sobot_common_gray;
//设置 聊天界面左边气泡内文字字体颜色
SobotUIConfig.sobot_chat_left_textColor = R.color.sobot_common_red;
//设置 聊天界面左边气泡内链接文字字体颜色
SobotUIConfig.sobot_chat_left_link_textColor = R.color.sobot_color;
//设置 聊天界面右边气泡背景颜色
SobotUIConfig.sobot_chat_right_bgColor = R.color.sobot_common_red;
//设置 聊天界面右边气泡内链接文字字体颜色
SobotUIConfig.sobot_chat_right_link_textColor = R.color.sobot_color;
//设置 聊天界面右边气泡内文字字体颜色
SobotUIConfig.sobot_chat_right_textColor = R.color.sobot_white;
//聊天界面文件消息类型气泡背景颜色
SobotUIConfig.sobot_chat_file_bgColor = R.color.sobot_common_red;
//设置 toolbar右边第一个按钮是否显示,默认显示(更多 2.9.5新增)
SobotUIConfig.sobot_title_right_menu1_display = true;
//设置 toolbar右边第二个按钮是否显示,默认隐藏(评价)
SobotUIConfig.sobot_title_right_menu2_display = true;
//设置 toolbar右边第三个按钮是否显示,默认隐藏(电话 2.9.5新增)
SobotUIConfig.sobot_title_right_menu3_display = true;
//修改toolbar右边第三个按钮的图片(电话图标R.drawable.sobot_phone)
SobotUIConfig.sobot_title_right_menu3_bg = R.drawable.sobot_phone;
//设置toolbar右边第三个按钮电话需要拨打的号码
SobotUIConfig.sobot_title_right_menu3_call_num = "18510000000";

# 4.6.2 动态控制显示标题栏的头像和昵称

默认显示只显示头像

/**
 * 设置聊天界面头部标题栏的昵称模式
 *
 * @param context      上下文对象
 * @param title_type   titile的显示模式
 *    SobotChatTitleDisplayMode.Default:显示客服昵称(默认)
 *    SobotChatTitleDisplayMode.ShowFixedText:显示固定文本
 *    SobotChatTitleDisplayMode.ShowCompanyName:显示console设置的企业名称
 * @param custom_title 如果需要显示固定文本,需要传入此参数,其他模式可以不传
 * @param isShowTitle  是否显示标题
 */
ZCSobotApi.setChatTitleDisplayMode(getApplicationContext(),
        SobotChatTitleDisplayMode.ShowFixedText, "昵称", true);        
      
 
/**
 * 设置聊天界面标题栏的头像模式
 *
 * @param context           上下文对象
 * @param avatar_type       头像的显示模式
 * SobotChatAvatarDisplayMode.Default:显示客服头像(默认)
 * SobotChatAvatarDisplayMode.ShowFixedAvatar:显示固定头像
 * SobotChatAvatarDisplayMode.ShowCompanyAvatar:显示console设置的企业名称
 * @param custom_avatar_url 如果需要显示固定头像,需要传入此参数,其他模式可以不传
 * @param isShowAvatar      是否显示头像
 */
SobotApi.setChatAvatarDisplayMode(getApplicationContext(),SobotChatAvatarDisplayMode.Default, "https://sobot-test.oss-cn-beijing.aliyuncs.com/console/66a522ea3ef944a98af45bac09220861/userImage/20191024164346682.PNG", false);

# 4.6.3 控制横竖屏显示开关

//true 横屏 , false 竖屏; 默认 false 竖屏
ZCSobotApi.setSwitchMarkStatus(MarkConfig.LANDSCAPE_SCREEN,false);

# 4.6.4 横屏下是否打开刘海屏开关

//只有在横屏下才有用;竖屏已适配,可修改状态栏颜色
//true 打开 ,false 关闭; 默认 false 关闭
ZCSobotApi.setSwitchMarkStatus(MarkConfig.DISPLAY_INNOTCH, true);

# 4.6.5 ui样式通过同名资源替换

在客户app中colors.xml中添加同名颜色可覆盖智齿sdk中的颜色样式;也可通过在主项目中同一位置放一个同名的图片资源去替换智齿sdk界面中的图片;也可通过在主项目中同一位置放一个同名的文字资源去替换智齿sdk界面中的文字;

以下是常用的颜色配置,更多颜色、图片资源可到手动集成模块中下载源码包中去查找;

    <!-- 主题色 默认绿色 -->
    <color name="sobot_color">@color/sobot_common_green</color>

    <!-- 头部开始 -->
    <!-- 头部背景 -->
    <color name="sobot_color_title_bar_bg">@color/sobot_white</color>
    <!-- 状态栏的颜色设置 -->
    <color name="sobot_status_bar_color">@color/sobot_color_title_bar_bg</color>
    <!-- 头部中间昵称颜色 -->
    <color name="sobot_color_title_bar_title">@color/sobot_common_gray1</color>


    <!-- 中间 聊天列表 -->
    <!-- 聊天背景 -->
    <color name="sobot_color_chat_bg">@color/sobot_white</color>
    <!--文本消息气泡 左侧  黑色字 -->
    <color name="sobot_left_msg_text_color">@color/sobot_common_gray1</color>
    <!--文本消息气泡 右侧 白色字 -->
    <color name="sobot_right_msg_text_color">@color/sobot_white</color>
    <!-- 超链接颜色 左边 -->
    <color name="sobot_color_link">@color/sobot_common_blue</color>
    <!-- 超链接颜色 右边 -->
    <color name="sobot_color_rlink">@color/sobot_common_yellow</color>
    <!-- 消息之间间隔 时间 颜色 -->
    <color name="sobot_color_remind_time_color">@color/sobot_common_gray2</color>
    <!-- 聊天界面提醒背景颜色-->
    <color name="sobot_listview_remind">@color/sobot_common_bg</color>
    <!-- 聊天界面提醒的字体颜色-->
    <color name="sobot_listview_remind_text_color">@color/sobot_common_gray2</color>
    <!-- 消息提醒中的超链接颜色 -->
    <color name="sobot_color_link_remind">@color/sobot_common_green</color>
    <!-- 文件消息气泡颜色 -->
    <color name="sobot_chat_file_bgColor">@color/sobot_color</color>
    <!-- 消息气泡左侧背景默认颜色 -->
    <color name="sobot_chat_left_bgColor">@color/sobot_common_gray4</color>
    <!-- 消息气泡右侧背景默认颜色 -->
    <color name="sobot_chat_right_bgColor">@color/sobot_color</color>

    <!-- 底部 -->
    <!-- 点击加号后 面板背景 -->
    <color name="sobot_color_bottom_bg">@color/sobot_white</color>
    <!-- 消息输入框 文字 颜色 -->
    <color name="sobot_color_bottom_msg_input_color">@color/sobot_common_gray1</color>
    <!-- 点击加号后 面板 按钮字体颜色 -->
    <color name="sobot_color_bottom_btn_wz_color">@color/sobot_common_gray1</color>

    <!-- 留言相关 -->
    <!--留言 导航栏切换 文字下边 横线 颜色  -->
    <color name="sobot_postMsg_nav_indicator_color">@color/sobot_color</color>
    <!--留言 导航栏切换 选中 字体 颜色  -->
    <color name="sobot_postMsg_nav_sel_tx_color">@color/sobot_common_gray1</color>
    <!--留言 导航栏切换  未选中字体 颜色  -->
    <color name="sobot_postMsg_nav_tx_color">@color/sobot_common_gray2</color>
    <!--留言引导语 超链接颜色  -->
    <color name="sobot_postMsg_url_color">@color/sobot_common_blue</color>

# 4.7 其他配置

# 4.7.1 自定义自动应答语

sdk中的自动应答语可以在pc工作台进行动态设置,

如果pc工作台的设置满足不了您的需求,那么您可以使用以下接口在代码中进行本地配置

注意:本地设置本地优先,PC端不在起效

3.0.4之后
information.setAdmin_Hello_Word( "自定义客服欢迎语");//自定义客服欢迎语,默认为空 (如果传入,优先使用该字段)
information.setRobot_Hello_Word( "自定义机器人欢迎语");//自定义机器人欢迎语,默认为空 (如果传入,优先使用该字段)
information.setUser_Tip_Word( "自定义用户超时提示语");//自定义用户超时提示语,默认为空 (如果传入,优先使用该字段)
information.setAdmin_Tip_Word("自定义客服超时提示语");//自定义客服超时提示语,默认为空 (如果传入,优先使用该字段)
information.setAdmin_Offline_Title( " 自定义客服不在线的说辞");// 自定义客服不在线的说辞,默认为空 (如果传入,优先使用该字段)
information.setUser_Out_Word( " 自定义用户超时下线提示语");// 自定义用户超时下线提示语,默认为空 (如果传入,优先使用该字段)

3.0.3之前
//自定义客服欢迎语,默认为空 (如果传入,优先使用该字段)
ZCSobotApi.setAdmin_Hello_Word(getApplicationContext(), "自定义客服欢迎语");
//自定义机器人欢迎语,默认为空 (如果传入,优先使用该字段)
ZCSobotApi.setRobot_Hello_Word(getApplicationContext(), "自定义机器人欢迎语");
//自定义用户超时提示语,默认为空 (如果传入,优先使用该字段)
ZCSobotApi.setUser_Tip_Word(getApplicationContext(), "自定义用户超时提示语");
//自定义客服超时提示语,默认为空 (如果传入,优先使用该字段)
ZCSobotApi.setAdmin_Tip_Word(getApplicationContext(), "自定义客服超时提示语");
// 自定义客服不在线的说辞,默认为空 (如果传入,优先使用该字段)
ZCSobotApi.setAdmin_Offline_Title(getApplicationContext(), " 自定义客服不在线的说辞");
// 自定义用户超时下线提示语,默认为空 (如果传入,优先使用该字段)
ZCSobotApi.setUser_Out_Word(getApplicationContext(), " 自定义用户超时下线提示语");

# 4.7.2 自定义聊天记录显示时间范围

如想设置用户只能看到xx天内的聊天记录,那么可以调用以下方法进行设置:

/**
 * 控制显示历史聊天记录的时间范围,最多只能显示60天内的消息,单位(分钟)
 * 不传默认会显示所有的历史记录
 * @param time  查询时间(例:100-表示从现在起前100分钟的会话)
*/
SobotApi.setScope_time(context,time);

# 4.7.3 “+”号面板菜单扩展

客服聊天界面中点击“+”按钮后所出现的菜单面板,可以根据需求自行添加菜单,代码如下:

 private void customMenu(){
        //添加扩展菜单数据
        ArrayList<ChattingPanelUploadView.SobotPlusEntity> objects = new ArrayList<>();
        /**
         * SobotPlusEntity为自定义菜单实体类
         * @param iconResId 菜单图标 drawableId
         * @param name      菜单名称
         * @param action    菜单动作 当点击按钮时会将对应action返回给callback
         *                  以此作为依据,判断用户点击了哪个按钮
         */
        objects.add(new ChattingPanelUploadView.SobotPlusEntity(R.drawable.sobot_camera_picture_button_selector, "位置", "action_location"));
        objects.add(new ChattingPanelUploadView.SobotPlusEntity(R.drawable.sobot_camera_picture_button_selector, "签到", "action_sing_in"));
        objects.add(new ChattingPanelUploadView.SobotPlusEntity(R.drawable.sobot_camera_picture_button_selector, "收藏", "action_ollection"));
        //添加数据
        SobotUIConfig.pulsMenu.menus = objects;
        //设置回调
        SobotUIConfig.pulsMenu.sSobotPlusMenuListener = new SobotPlusMenuListener() {
            @Override
            public void onClick(View view, String action) {
                //action与实体类中的action对应
                ToastUtil.showToast(getApplicationContext(), "action:"+action);
            }
        };
    }

# 4.7.4 调起拨号界面接口

/**
* @param phone 是传入的电话号码 context 上下文对象
*/
CommonUtils.callUp(String phone, Context context)

# 4.7.5 智齿日志显示开关

/**
* true 显示日志信息 默认false不显示
*/
ZCSobotApi.setShowDebug(false);

//2.8.5以前版本方法
/日志显示开关 true 打开;false 关闭;默认关闭
LogUtils.isDebug = true;
//日志显示各级别开关 true 显示;false 不显示
LogUtils.allowI = true;
LogUtils.allowD = false;
LogUtils.allowE = false;
LogUtils.allowI = false;
LogUtils.allowV = false;
LogUtils.allowI = false;

# 4.7.6 多语言支持

方式一、 目前SDK支持英文和中文两种语言,语言会根据当前手机语言自行切换适配,如果当前手机语言不识别,默认使用中文。

如果需要新增语言包,把支持的语言文件放入对应的语言目录下即可,例如;英文路径:sobotsdk/src/main/res/values-en/strings.xml;

[说明:语言文件夹名称为values-的后面加上语言的标示,例如values-en;strings.xml名字不变]

方式二、

 /**
     * 2.8.6 新增,使用功能需和智齿开发沟通,服务端是否有对应的语言包
     * 指定使用国际化语言包
     * 如果本地没有指定的语言时,开始下载,下载前会检测存储权限,没有权限,直接返回,使用系统权限
     *
     * @param language     指定语言名字 例如  "zh-Hans":简体中文 "en":英文 "zh-Hant":繁体中文 "ru":俄语 "ko":韩语 "ja":日语 "ar":阿拉伯语  "th":泰国语 (2.9.0后添加)"pl":波兰语 "vi":越南语
     * @param isUse        是否使用指定语言
     * @param isReDownload 是否重新下载语言包 true 重新下载,false 不重新下载,默认false
     */
    ZCSobotApi.setInternationalLanguage(context,language, isUse, isReDownload);

服务端接口多语言指定(2.8.9版本之后支持)、

 /**
  * 支持语言: 简体中文:zh-Hans 繁体中文:zh-Hant 英语:en 西班牙语:es 葡萄牙语:pt
  */
    info.setLocale("your language");

特殊处理:
如果多语言时配置了人工评价或机器人评价标签,不支持多语言显示,可以通过如下属性隐藏显示(不影响评价功能使用,仅评价内容中缺失标签)

//  隐藏机器人时评价标签,默认不隐藏。 true 隐藏 ;false 显示
info.setHideRototEvaluationLabels(false);

//  隐藏人工时评价标签,默认不隐藏。 true 隐藏 ;false 显示
info.setHideManualEvaluationLabels(false);

# 4.7.7 时区适配

从2.8.9版本开始支持,默认系统北京东八区标准事件,如果需要根据手机时区动态适配,配置如下代码:

// false 默认使用东八区时区,true 自动适配手机系统设置的时区
ZCSobotApi.setSwitchMarkStatus(MarkConfig.AUTO_MATCH_TIMEZONE, false);

# 4.7.8 弹出权限用途提示框

从2.9.1版本开始支持,是否在申请权限前弹出权限用途提示框,配置如下代码:

// 是否在申请权限前弹出权限用途提示框,默认 false 不弹,true 弹
ZCSobotApi.setSwitchMarkStatus(MarkConfig.SHOW_PERMISSION_TIPS_POP, false);

# 4.7.9 智齿部分功能页面点击返回的监听(只记录不拦截),可自己添加逻辑(例如埋点)

ZCSobotApi.setFunctionClickListener(new SobotFunctionClickListener() {
            @Override
            public void onClickFunction(Context context, SobotFunctionType functionType) {
                //1:留言返回,2:会话页面返回,3:帮助中心返回,4:电商消息中心页面返回,5:电话联系客服
                LogUtils.i(functionType.toString());
            }
        });

# 4.7.10 安全校验

1.功能位置:在线渠道设置-渠道安全设置-安全秘钥设置-勾选“生效范围(APP)"。

2、开启生效范围APP“安全密钥”功能后,sdk渠道必须传partnerid参数。且对接时传参增加参数“sign”和“createTime”,其中,sign=“MD5(app_key+partnerid+密钥+createTime)”,createTime是unix毫秒时间戳;secret长度为32的字符串,createTime是毫秒级时间戳。

3、传入参数后智齿会对sign进行解密,验证传入的partnerid与sign中传入的partnerid是否一致,若一致则正常接入智齿系统,若不一致则接入失败。若客户没有传partnerid或sign,则视同非法用户,接入失败;若createTime与当前时间相差超过5分钟,则是为非法用户,接入失败。

4、APP“安全密钥”的功能开启和关闭,生效范围的设置是实时生效的。

  //启动智齿页面时传入下边两个参数
  //签名
  info.setSign(your sign);
  //毫秒级时间戳
  info.setCreateTime(crete_time);

# 5 Information类说明

# id 相关:

属性名称 数据类型 说明 备注
app_key String 必须设置,不设置初始化不成功。 必填
choose_adminid String 指定客服ID
tranReceptionistFlag int 指定客服 转接类型 0 可转入其他客服 1 必须转入指定客服
partnerid String 用户唯一标识 对接用户可靠身份,不能写死,不建议为null,如果为空会以设备区别
robot_code String 对接机器人ID
robot_alias String 对接机器人ID对应的别名
faqId String 常见问题参数
sign String 签名md5加密(app_key+partnerid+secret+create_time)
createTime String 时间戳

电商版:

设置电商转人工溢出策略,以下属性与transferaction冲突,如果设置transferaction,将覆盖flow_type、flow_companyid、flow_groupid的配置。

属性名称 数据类型 说明 备注
customer_code String 商户对接id (仅电商版适用,如果没有app_key,请提供此编码)

# 客服工作台显示:

属性名称 数据类型 说明 备注
user_nick String 昵称
user_name String 真实姓名
user_tels String 用户电话
user_emails String 用户邮箱
qq String qq
remark String 备注
face String 用户自定义头像
visit_title String 接入来源页面标题
visit_url String 接入的来源URL
params String 用户资料
customer_fields String 固定KEY的自定义字段
group_name String 技能组名称
groupid String 技能组编号
isVip String 指定客户是否为vip
vip_level String vip等级
user_label String 用户标签

# 会话页面相关:

属性名称 数据类型 说明 备注
service_mode int 自定义接入模式 1只有机器人,2.仅人工 3.智能客服-机器人优先 4智能客服-人工客服优先
custom_title_url String 聊天页顶部标题 自定义图像路径

# 其他:

属性名称 数据类型 说明 备注
transferaction String 转人工 指定技能组 溢出
summary_params String 转人工自定义字段
multi_params String 多轮会话 自定义字段
margs String 热点引导问题的扩展字段
content String 自动发送商品订单信息内容
queue_first boolean 指定客户优先
isArtificialIntelligence boolean 是否智能转人工,默认false
artificialIntelligenceNum int 如果是只能转人工,那么未知问题或者向导问题出现多少次时,显示转人工按钮。默认是一次
isUseVoice boolean 是否使用语音功能 默认true,可以使用语音功能
isUseRobotVoice boolean 是否使用机器人语音功能 默认false,机器人不可以使用语音功能 会转为文字
isShowLeftBackPop boolean 左上角返回时是否弹出(您是否结束会话?) 默认false不弹
isShowSatisfaction boolean 导航栏左侧点击返回时是否弹出满意度评价。默认false,弹出,false不弹满意度
isShowCloseSatisfaction boolean 导航栏关闭按钮关闭时是否弹出满意度评价。默认false,弹出,false不弹满意度。
equipmentId String 设备编号
tranReceptionistFlag int 转接类型(0-可转入其他客服,1-必须转入指定客服)
transferKeyWord HashSet 转人工关键字
isCloseInquiryForm boolean 是否关闭询前表单
leaveMsgGuideContent String 留言引导文案
leaveMsgGroupId String 留言技能组
leaveCusFieldMap Map 留言自定义字段
leaveParamsExtends List 对接型字段
leaveTemplateId List 留言模版id
hideMenuSatisfaction boolean 隐藏评价
hideMenuLeave boolean 隐藏留言
hideMenuPicture boolean 隐藏图片
hideMenuVedio boolean 隐藏视频
hideMenuCamera boolean 隐藏拍摄
hideMenuFile boolean 隐藏文件
showLeaveDetailBackEvaluate boolean 留言详情界面返回弹出服务评价窗口
canBackWithNotEvaluation boolean 弹出评价窗口时,暂不评价按钮
hideRototEvaluationLabels boolean 是否隐藏机器人评价标签
hideManualEvaluationLabels boolean 是否隐藏人工评价标签
locale String 服务端接口国际化语言
helpCenterTel String 帮助中心添加呼叫电话号码
helpCenterTelTitle String 帮助中心电话号码按钮字段
hideMenuManualLeave boolean 仅隐藏人工状态下的留言

# 6 智齿SDK功能使用体验Demo

点击下载 Demo 源码;

点击下载体验安装包;

点击查看Demo使用教程

# 7 常见问题链接

https://github.com/ZCSDK/FAQ_Android

# 8 更新说明

<<智齿客服安卓SDK更新说明>>

# 9 智齿科技SDK收集使用个人信息说明

<<智齿科技SDK收集使用个人信息说明>>