先贴上客服系统官网http://www.udesk.cn/doc/android/udesksdk_android/#_3
Android Udeskdemo地址 https://github.com/udesk/UdeskSDK-Android 这个地址在API上我是没有找到,但iOS的api上却有一个ios的demo地址,笔者根据链接样式将末尾的IOS改成Android试了一下,没想到奇迹就此出现了;
下面开始集成步骤:
1、导入appkey和 app id;
此处的Appkey和AppID是在登录Udesk后台后能查看的,而此处的domain则是登录后的页面链接,应该是****.udesk.cn
2、设置UdeskConfig信息
这里是提供给客服看的一些客户的信息,比如名字、邮箱、手机号和简介等,此处的sdkToken是必传的,这是作为用户的唯一标识的,进入会话用UdeskSDKManager.getInstance().entryChat()这个方法,进去之后的消息的发送以及接收就是Udesk所处理的事了,下面是一些UdeskConfig内部类Builder的说明:
属性 | 设置方法 | 功能说明 |
---|---|---|
udeskTitlebarBgResId | setUdeskTitlebarBgResId | 标题栏TitleBar的背景色,通过颜色设置 |
udeskTitlebarTextLeftRightResId | setUdeskTitlebarTextLeftRightResId | 标题栏TitleBar,左右两侧文字的颜色 |
udeskIMLeftTextColorResId | setUdeskIMLeftTextColorResId | IM界面,左侧文字的字体颜色 |
udeskIMRightTextColorResId | setUdeskIMRightTextColorResId | IM界面,右侧文字的字体颜色 |
udeskIMAgentNickNameColorResId | setUdeskIMAgentNickNameColorResId | IM界面,左侧客服昵称文字的字体颜色 |
udeskIMTimeTextColorResId | setUdeskIMTimeTextColorResId | IM界面,时间文字的字体颜色 |
udeskIMTipTextColorResId | setUdeskIMTipTextColorResId | IM界面,提示语文字的字体颜色,比如客服转移 |
udeskbackArrowIconResId | setUdeskbackArrowIconResId | 返回箭头图标资源id |
udeskCommityBgResId | setUdeskCommityBgResId | 咨询商品item的背景颜色 |
udeskCommityTitleColorResId | setUdeskCommityTitleColorResId | 商品介绍Title的字样颜色 |
udeskCommitysubtitleColorResId | setUdeskCommitysubtitleColorResId | 商品咨询页面中,商品介绍子Title的字样颜色 |
udeskCommityLinkColorResId | setUdeskCommityLinkColorResId | 商品咨询页面中,发送链接的字样颜色 |
isUserSDkPush | setUserSDkPush | 配置 是否使用推送服务 true 表示使用 false表示不使用 |
UdeskQuenuMode | setUdeskQuenuMode | 配置放弃排队的策略 |
isUseVoice | setUseVoice | 是否使用录音功能 true表示使用 false表示不使用 |
isUsephoto | setUsephoto | 是否使用发送图片的功能 true表示使用 false表示不使用 |
isUsecamera | setUsecamera | 是否使用拍照的功能 true表示使用 false表示不使用 |
isUsefile | setUsefile | 是否使用上传文件功能 true表示使用 false表示不使用 |
isUsefile | setUseMap | 是否使用发送位置功能 true表示使用 false表示不使用 |
isUseEmotion | setUseEmotion | 是否使用表情 true表示使用 false表示不使用 |
isUseMore | setUseMore | 否使用展示出更多功能选项 true表示使用 false表示不使用 |
isUseSmallVideo | setUseSmallVideo | 设置是否需要小视频的功能 rue表示使用 false表示不使用 |
ScaleMax | setScaleImg | 上传图片是否使用原图 还是缩率图 |
isScaleImg | setScaleMax | 设置宽高最大值,如果超出则压缩,否则不压缩 |
Orientation | setOrientation | 设置默认屏幕显示习惯 |
isUserForm | setUserForm | 本地配置是否需要表单留言,true需要, false 不需要 |
defualtUserInfo | setDefualtUserInfo | 创建用户的基本信息 |
definedUserTextField | setDefinedUserTextField | 创建自定义的文本信息 |
definedUserRoplist | setDefinedUserRoplist | 创建自定义的列表信息 |
updateDefualtUserInfo | setUpdateDefualtUserInfo | 用户需要更新的基本信息 |
updatedefinedUserTextField | setUpdatedefinedUserTextField | 用户需要更新自定义字段文本信息 |
updatedefinedUserRoplist | setUpdatedefinedUserRoplist | 用户需要更新自定义列表字段信息 |
firstMessage | setFirstMessage | 设置带入一条消息 会话分配就发送给客服 |
robot_modelKey | setRobot_modelKey | udesk 机器人配置欢迎语 对应的Id值 |
concatRobotUrlWithCustomerInfo | setConcatRobotUrlWithCustomerInfo | 用于机器人页面收集客户信息 |
customerUrl | setCustomerUrl | 设置客户的头像地址 |
commodity | setCommodity | 配置发送商品链接的mode |
txtMessageClick | setTxtMessageClick | 文本消息中的链接消息的点击事件的拦截回调。 包含表情的不会拦截回调 |
formCallBack | setFormCallBack | 离线留言表单的回调接口 ,回调使用自己的处理流程 |
structMessageCallBack | setStructMessageCallBack | 设置结构化消息的点击事件回调接口 |
extreFunctions | setExtreFunctions | 设置额外的功能按钮 |
functionItemClickCallBack | setExtreFunctions | 点击事件回调 直接发送文本,图片,视频,文件,地理位置,商品信息 |
isUseNavigationRootView | setNavigations | 设置是否使用导航UI true表示使用 false表示不使用 |
navigationModes | setNavigations | 约定传递的自定义按钮集合 |
navigationItemClickCallBack | setNavigations | 支持客户在导航处添加自定义按钮的点击回调事件 |
isUseNavigationSurvy | setUseNavigationSurvy | 设置是否使用导航UI中的满意度评价UI rue表示使用 false表示不使用 |
useMapType | setUseMapSetting | 设置使用那种地图 |
locationMessageClickCallBack | setUseMapSetting | 点击地理位置信息的回调接口 |
cls | setUseMapSetting | 传入打开地图消息显示的详请activity |
groupId | setGroupId | 设置的指定组,每次进入都必须重新指定 |
isOnlyByGroupId | setGroupId | 是否仅仅指定组进入 |
agentId | setAgentId | 设置指订客服id,每次进入都必须重新指定 |
isOnlyByAgentId | setAgentId | 是否仅仅指定客服进入 |
isOnlyUseRobot | setOnlyUseRobot | 设置是否只使用机器人 不用其它功能 |
locale | setLocale | 设置本地化语言 |
mProduct | setProduct | 设置商品消息 |
可以看到里边的可操作性还是很强的,基本上能满足大部分的需求了,并且此第三方是以module的方式导入的,在程序内部也能做小幅改动;
3、Udesk的混淆
//udesk
-keep class udesk.** {*;}
-keep class cn.udesk.**{*; }
//七牛
-keep class okhttp3.** {*;}
-keep class okio.** {*;}
-keep class com.qiniu.**{*;}
-keep class com.qiniu.**{public <init>();}
-ignorewarnings
//smack
-keep class org.jxmpp.** {*;}
-keep class de.measite.** {*;}
-keep class org.jivesoftware.** {*;}
-keep class org.xmlpull.** {*;}
-dontwarn org.xbill.**
-keep class org.xbill.** {*;}
//eventbus
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
//freso
-keep class com.facebook.** {*; }
-keep class com.facebook.imagepipeline.** {*; }
-keep class com.facebook.animated.gif.** {*; }
-keep class com.facebook.drawee.** {*; }
-keep class com.facebook.drawee.backends.pipeline.** {*; }
-keep class com.facebook.imagepipeline.** {*; }
-keep class bolts.** {*; }
-keep class me.relex.photodraweeview.** {*; }
-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
@com.facebook.common.internal.DoNotStrip *;
}
# Keep native methods
-keepclassmembers class * {
native <methods>;
}
-dontwarn okio.**
-dontwarn com.squareup.okhttp.**
-dontwarn okhttp3.**
-dontwarn javax.annotation.**
-dontwarn com.android.volley.toolbox.**
-dontwarn com.facebook.infer.**
//bugly
-keep class com.tencent.bugly.** {*; }
//agora
-keep class io.agora.**{*;}
这里我们可以看到里边还是有很多第三方引用的,这里就会隐藏着一个问题——依赖冲突!!!笔者就遇到了这个问题
首先是与七牛里的okhttp的冲突笔者做了如下处理将七牛里的okhttp排除掉不进行依赖
compile ('com.qiniu:qiniu-android-sdk:7.3.+'){
exclude module: 'okhttp'
}
接下来是bugly的包冲突,Udesk里集成bugly是以jar包形式引入的,所以将Udesk的gradle中对应的jar包依赖进行如下更改
compile files('libs/bugly_crash_release_2.1.jar')→→→→→→provided files('libs/bugly_crash_release_2.1.jar')
也就是将compile改成provided 这种改发是为了仅让此依赖在当前module生效,当然还有一步操作是将
compile fileTree(include: ['*.jar'], dir: 'libs')这句话去掉,不然此设置不生效;
4、关于用户信息的更新;
相信很多App内部都有更新用户头像或者名字信息之类的操作,那么我们怎么将此信息及时的在Udesk的聊天中进行更新呢?下面看笔者的实现方式:
由于每次进入会话界面都会调用UdeskSDKManager.getInstance().entryChat()方法将UdeskConfig传到会话页面,所以我们每次对UdeskConfig进行一次最新信息的设置就好了,通过看UdeskConfig的源码发现其下的Builder中有setDefualtUserInfo和setUpdateDefualtUserInfo两个方法,从字面意思很明显就能看出一个是设置默认UserInfo的方法 一个是更新UserInfo的方法,这就需要我们判断是否设置了默认UserInfo,设置了即调用更新方法 没设置进行设置,但是这个判断方式就犯难了,笔者一度想用一个boolean值进行记录,但又觉得这种实现方式实在是low,后来翻了半天源码终于让我找到了方式,下面就是见证奇迹的时刻:
UdeskConfig.Builder builder = new UdeskConfig.Builder();
if (UdeskSDKManager.getInstance().getUdeskConfig().defualtUserInfo == null) {
builder.setDefualtUserInfo(getDefualtUserInfo(token));
} else {
builder.setUpdateDefualtUserInfo(getDefualtUserInfo(token));
}
以上是笔者的判断方式,通过判断UdeskSDKManager.getInstance().getUdeskConfig().defualtUserInfo是否为null进行判断是否设置了默认UserInfo,从而进行接下来的操作;
这里要说一个算是该平台的一个bug,就是当你改了名字而继续进行当前聊天的话,客服那边是看不到你的新名字的,只有客服刷新页面之后才会显示新名字,这个bug废了笔者很大的劲,最后跟Udesk客服进行咨询才得知。。。
笔者此次只用到了一些基本功能,视频及定位等功能暂未涉及,但是看着api上写的也很详细很具体了;朋友们有什么疑问随时进行交流;