如果需要使用 字段类型是下拉框,级联, 复选框 的字段;需要修改UdeskBaseWebViewActivity类中的initView
需要修改UdeskBaseWebViewActivity类中的initView()放法中初始化Webview中上下文参数。
mwebView = new WebView(getApplicationContext());
改成
mwebView = new WebView(this);
修改原因解释:
WebView传入Activity上下文可能会出现内存泄漏的隐患。 如果传入Application的上下文,使用下拉框字段会出,
下拉框需要创建对话框,对话框创建不能用getApplicationContext()得到的context,必须用Activity,否则会出现异常。
如果你的项目打包指定了so库的加载配置了,
ndk{
abiFilters "armeabi"
}
你需要特别注意fresco版本号 在fresco 1.9.0 以后的的 Application.mk APP_ABI := armeabi-v7a armeabi arm64-v8a x86 x86_64,
不在包含armeabi
在UdeskSDKUI下的build.gradle文件下 修改dependencies fresco版本号 不能根据androidstudio提示更新到最新
创建用户的基本信息(setDefualtUserInfo(Map<String, String> defualtUserInfo))
和 更新用户的基本信息不能共用(setUpdateDefualtUserInfo(Map<String, String> updateDefualtUserInfo))
不能共用同一个Map, 创建用户信息必须设置sdktoken,二更新用户信息不能设置sdktoken。并且更新用户信息如果设置了电话和邮箱,udesk系统存在,
会导致更新失败, 建议自定义字段来采集用户的邮箱和电话信息。
demo中的 NotificationUtils,状态通知栏没有做 Android O通知栏适配, 你在实现targetSdkVersion 大于26时, 必须做对应的通知栏适配,
不可以用NotificationUtils 处理方式
UdeskSDKManager.getInstance().initApiKey(context, "you domain","App Key","App Id");
注意:域名不要带有http://部分,加入注册生成的域名是"http://udesksdk.udesk.cn/" ,只要传入"udesksdk.udesk.cn"
说明:配置的功能根据你们实际的需要进行选择,都有默认行为。 最基本设置用户的基本信息 setDefualtUserInfo
默认系统字段是Udesk已定义好的字段,开发者可以直接传入这些用户信息,供客服查看。
String sdktoken = “用户唯一的标识”;
Map<String, String> info = new HashMap<String, String>();
**//sdktoken 必填**
info.put(UdeskConst.UdeskUserInfo.USER_SDK_TOKEN, sdktoken);
//以下信息是可选
info.put(UdeskConst.UdeskUserInfo.NICK_NAME,"昵称");
info.put(UdeskConst.UdeskUserInfo.EMAIL,"[email protected]");
info.put(UdeskConst.UdeskUserInfo.CELLPHONE,"15651818750");
info.put(UdeskConst.UdeskUserInfo.DESCRIPTION,"描述信息")
只设置用户基本信息的配置
UdeskConfig.Builder builder = new UdeskConfig.Builder();
builder.setDefualtUserInfo(info)
UdeskSDKManager.getInstance().entryChat(getApplicationContext(), builder.build(), sdkToken);
默认客户字段说明
key | 是否必选 | 说明 |
---|---|---|
sdk_token | 必选 | 用户唯一标识 |
cellphone | 可选 | 用户手机号 |
可选 | 邮箱账号 | |
description | 可选 | 用户描述 |
导入集成
1 远程依赖集成
1.Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
2.Add the dependency
全功能
dependencies {
implementation 'com.github.udesk:UdeskSDK-Android:版本号'
}
部分功能
dependencies {
implementation 'com.github.udesk.UdeskSDK-Android:模块名(UdeskSDKUI|udeskvideo):版本号'
}
3.添加其他依赖库
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.facebook.fresco:fresco:1.3.0'
implementation 'com.facebook.fresco:animated-gif:1.3.0'
implementation 'me.relex:photodraweeview:1.1.3'
implementation 'com.lzy.net:okgo:3.0.4'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'org.greenrobot:eventbus:3.0.0'
2 本地集成
你所要做的是把UdeskSDKUI做为独立的module import, 并在你APP build.gradle文件中加入:
dependencies {
compile project(':UdeskSDKUI')
}
初始化客户逻辑
1使用主键 sdk_token customer_token email cellphone 依次查找用户,找到转1.1
1.1 设找到的用户为customer
1.2 如果有 sdk_token 参数并且不与 customer中原有的sdk_token相同, go 1.2.1
1.2.1 更新用户主键及附加信息
1.3 更新 device
2创建用户 email 没有会默认生成
3创建用户 device
4如果转入 customer_token 但以当前 customer.open_api_token 不同,也不与其它客户冲突,更新 customer_token 到客户 open_api_token 字段
创建用户失败返回的常见错误
wrong_subdomain: {code: "2001" , message: "子域名错误"},
no_sdktoken: {code: "2003" , message: "用户token错误"},
wrong_sign: {code: "3001" , message: "签名错"},
agent: {code: "5050" , message: "客服不存在"},
user_group: {code: "5060" , message: "客服组不存在"}
validate_error: {:code=>"2004", :message=>"验证错", :exception=>"Validation failed: Email is invalid"}
exception 中会带有具体验证错误信息
注意sdktoken 是客户的唯一标识,用来识别身份,sdk_token: 传入的字符请使用 字母 / 数字 字符集 。就如同身份证一样,不允许出现一个身份证号对应多个人,或者一个人有多个身份证号;其次如果给顾客设置了邮箱和手机号码,也要保证不同顾客对应的手机号和邮箱不一样,如出现相同的,则不会创建新顾客。 完成了以上操作,接下来就可以使用UdeskSDK的其它功能了,祝你好运!
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 | 设置是否只使用机器人 不用其它功能 |
mProduct | setProduct | 设置商品消息 |
channel | setChannel | SDK支持自定义渠道(只支持字符数字,不支持特殊支持) |
udeskProductBgResId | setUdeskProductBgResId | 设置商品消息背景 |
udeskProductMaxLines | setUdeskProductMaxLines | 设置商品消息名称最大显示行数 |
一个完整的参考例子
private UdeskConfig.Builder makeBuilder() {
if (!TextUtils.isEmpty(edit_language.getText().toString())){
LocalManageUtil.saveSelectLanguage(getApplicationContext(),new Locale(edit_language.getText().toString()));
}
UdeskConfig.Builder builder = new UdeskConfig.Builder();
builder.setUdeskTitlebarBgResId(R.color.udesk_titlebar_bg1) //设置标题栏TitleBar的背景色
.setUdeskTitlebarTextLeftRightResId(R.color.udesk_color_navi_text1) //设置标题栏TitleBar,左右两侧文字的颜色
.setUdeskIMLeftTextColorResId(R.color.udesk_color_im_text_left1) //设置IM界面,左侧文字的字体颜色
.setUdeskIMRightTextColorResId(R.color.udesk_color_im_text_right1) // 设置IM界面,右侧文字的字体颜色
.setUdeskIMAgentNickNameColorResId(R.color.udesk_color_im_left_nickname1) //设置IM界面,左侧客服昵称文字的字体颜色
.setUdeskIMTimeTextColorResId(R.color.udesk_color_im_time_text1) // 设置IM界面,时间文字的字体颜色
.setUdeskIMTipTextColorResId(R.color.udesk_color_im_tip_text1) //设置IM界面,提示语文字的字体颜色,比如客服转移
.setUdeskbackArrowIconResId(R.drawable.udesk_titlebar_back) // 设置返回箭头图标资源id
.setUdeskCommityBgResId(R.color.udesk_color_im_commondity_bg1) //咨询商品item的背景颜色
.setUdeskCommityTitleColorResId(R.color.udesk_color_im_commondity_title1) // 商品介绍Title的字样颜色
.setUdeskCommitysubtitleColorResId(R.color.udesk_color_im_commondity_subtitle1)// 商品咨询页面中,商品介绍子Title的字样颜色
.setUdeskCommityLinkColorResId(R.color.udesk_color_im_commondity_link1) //商品咨询页面中,发送链接的字样颜色
.setUdeskProductBgResId(R.drawable.udesk_im_item_bg_right) //商品消息背景
.setUdeskProductMaxLines(2) //商品消息名称最大显示行数
.setUserSDkPush(set_sdkpush.isChecked()) // 配置 是否使用推送服务 true 表示使用 false表示不使用
.setOnlyUseRobot(set_use_onlyrobot.isChecked())//配置是否只使用机器人功能 只使用机器人功能,只使用机器人功能; 其它功能不使用。
.setUdeskQuenuMode(force_quit.isChecked() ? UdeskConfig.UdeskQuenuFlag.FORCE_QUIT : UdeskConfig.UdeskQuenuFlag.Mark) // 配置放弃排队的策略
.setUseVoice(set_usevoice.isChecked()) // 是否使用录音功能 true表示使用 false表示不使用
.setUsephoto(set_usephoto.isChecked()) //是否使用发送图片的功能 true表示使用 false表示不使用
.setUsecamera(set_usecamera.isChecked()) //是否使用拍照的功能 true表示使用 false表示不使用
.setUsefile(set_usefile.isChecked()) //是否使用上传文件功能 true表示使用 false表示不使用
.setUseMap(set_usemap.isChecked()) //是否使用发送位置功能 true表示使用 false表示不使用
.setUseMapSetting(UdeskConfig.UdeskMapType.GaoDe, LocationActivity.class, new ILocationMessageClickCallBack() {
@Override
public void luanchMap(Context context, double latitude, double longitude, String selctLoactionValue) {
Intent intent = new Intent();
intent.putExtra(UdeskConfig.UdeskMapIntentName.Position, selctLoactionValue);
intent.putExtra(UdeskConfig.UdeskMapIntentName.Latitude, latitude);
intent.putExtra(UdeskConfig.UdeskMapIntentName.Longitude, longitude);
intent.setClass(context, ShowSelectLocationActivity.class);
context.startActivity(intent);
}
})
.setUseEmotion(set_useemotion.isChecked()) //是否使用表情 true表示使用 false表示不使用
.setUseMore(set_usemore.isChecked()) // 是否使用更多控件 展示出更多功能选项 true表示使用 false表示不使用
.setUseNavigationSurvy(set_use_navigation_survy.isChecked()) //设置是否使用导航UI中的满意度评价UI rue表示使用 false表示不使用
.setUseSmallVideo(set_use_smallvideo.isChecked()) //设置是否需要小视频的功能 rue表示使用 false表示不使用
.setScaleImg(set_use_isscaleimg.isChecked()) //上传图片是否使用原图 还是缩率图
.setScaleMax(1024) // 缩放图 设置最大值,如果超出则压缩,否则不压缩
.setOrientation(landscape.isChecked() ? UdeskConfig.OrientationValue.landscape :
(user.isChecked() ? UdeskConfig.OrientationValue.user : UdeskConfig.OrientationValue.portrait)) //设置默认屏幕显示习惯
.setUserForm(true) //在没有请求到管理员在后端对sdk使用配置下,在默认的情况下,是否需要表单留言,true需要, false 不需要
.setDefualtUserInfo(getDefualtUserInfo()) // 创建用户基本信息
.setDefinedUserTextField(getDefinedUserTextField()) //创建用户自定义的文本信息
.setDefinedUserRoplist(getDefinedUserRoplist()) //创建用户自定义的列表信息
.setUpdateDefualtUserInfo(getUpdateDefualtUserInfo()) // 设置更新用户的基本信息
.setUpdatedefinedUserTextField(getUpdateDefinedTextField()) //设置用户更新自定义字段文本信息
.setUpdatedefinedUserRoplist(getUpdateDefinedRoplist()) //设置用户更新自定义列表字段信息
.setFirstMessage(firstMessage.getText().toString()) //设置带入一条消息 会话分配就发送给客服
.setCustomerUrl(customerUrl.getText().toString()) //设置客户的头像地址
.setRobot_modelKey(robot_modelKey.getText().toString()) // udesk 机器人配置常见问题 对应的Id值
.setConcatRobotUrlWithCustomerInfo(robpt_customer_info.getText().toString())
.setCommodity(set_use_commodity.isChecked() ? createCommodity() : null)//配置发送商品链接的mode
.setProduct(set_use_prouct.isChecked() ? createProduct() : null)//配置发送商品链接的mode
.setExtreFunctions(getExtraFunctions(), new IFunctionItemClickCallBack() {
@Override
public void callBack(Context context, ChatActivityPresenter mPresenter, int id, String name) {
if (id == 22) {
mPresenter.sendCommodityMessage(createCommodity());
} else if (id == 23) {
UdeskSDKManager.getInstance().disConnectXmpp();
} else if (id == 24) {
mPresenter.sendProductMessage(createProduct());
}
}
})//在more 展开面板中设置额外的功能按钮
.setNavigations(set_use_navigation_view.isChecked(), getNavigations(), new INavigationItemClickCallBack() {
@Override
public void callBack(Context context, ChatActivityPresenter mPresenter, NavigationMode navigationMode) {
if (navigationMode.getId() == 1) {
mPresenter.sendProductMessage(createProduct());
} else if (navigationMode.getId() == 2) {
mPresenter.sendTxtMessage(UUID.randomUUID().toString());
mPresenter.sendTxtMessage("www.baidu.com");
}
}
})//设置是否使用导航UI rue表示使用 false表示不使用
.setTxtMessageClick(new ITxtMessageWebonCliclk() {
@Override
public void txtMsgOnclick(String url) {
Toast.makeText(getApplicationContext(), "对文本消息中的链接消息处理设置回调", Toast.LENGTH_SHORT).show();
}
}) //如果需要对文本消息中的链接消息处理可以设置该回调,点击事件的拦截回调。 包含表情的不会拦截回调。
.setFormCallBack(new IUdeskFormCallBack() {
@Override
public void toLuachForm(Context context) {
Toast.makeText(getApplicationContext(), "不用udesk系统提供的留言功能", Toast.LENGTH_SHORT).show();
}
})//离线留言表单的回调接口: 如果不用udesk系统提供的留言功能,可以设置该接口 回调使用自己的处理流程
.setStructMessageCallBack(new IUdeskStructMessageCallBack() {
@Override
public void structMsgCallBack(Context context, String josnValue) {
Toast.makeText(getApplicationContext(), "结构化消息控件点击事件回调", Toast.LENGTH_SHORT).show();
}
})//设置结构化消息控件点击事件回调接口.
.setChannel(channel.getText().toString())
;
return builder;
}
UdeskSDKManager.getInstance().entryChat(getApplicationContext(), makeBuilder().build(), sdkToken);
注意:只有通过这个方法进入会话,管理员在后台配置的选项才会生效, 其它方式进入会话,配置不会生效。
//udesk
-keep class udesk.** {*;}
-keep class cn.udesk.**{*; }
//JSONobject
-keep class org.json.** {*; }
//okhttp
-keep class okhttp3.** {*;}
-keep class okio.** {*;}
//okgo
-keep class com.lzy.okgo.** {*;}
-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.**
-dontwarn com.lzy.okgo.**
//bugly
-keep class com.tencent.bugly.** {*; }
//agora
-keep class io.agora.**{*;}
UdeskCommodityItem item = new UdeskCommodityItem();
item.setTitle("木林森男鞋新款2016夏季透气网鞋男士休闲鞋网面韩版懒人蹬潮鞋子");// 商品主标题
item.setSubTitle("¥ 99.00");//商品副标题
item.setThumbHttpUrl("https://img.alicdn.com/imgextra/i1/1728293990/TB2ngm0qFXXXXcOXXXXXXXXXXXX_!!1728293990.jpg_430x430q90.jpg");// 左侧图片
item.setCommodityUrl("https://detail.tmall.com/item.htm?spm=a1z10.3746-b.w4946-14396547293.1.4PUcgZ&id=529634221064&sku_properties=-1:-1");// 商品网络链接
UdeskSDKManager.getInstance().setCommodity(item);
在进入会话界面前调用 。
LocalManageUtil.saveSelectLanguage
更多功参考demo。
1,自定义表情必须在assets下建立udeskemotion目录,当程序启动时,会自动将assets的udeskemotion目录下所有的贴图复制到贴图的存放位置;
2,udeskemotion目录下必须是 一个tab图标+一个贴图文件夹,两者必须同名
具体参考demo
android 接入的第三方选择性比较多等原因,没有直接在SDK中内嵌地图SDK,由客户根据实际需要选择是否集成发送地理位置信息。
提供集成地图的demo例子有:百度地图(见baidumapdemo 这个module),高德地图(gaodemapdemo)腾讯地图(tenxunmapdemo)
1.地图类型的说明
百度地图设置
UdeskConfig.useMapType = UdeskConfig.UdeskMapType.BaiDu;
高德地图设置
UdeskConfig.useMapType = UdeskConfig.UdeskMapType.GaoDe;
腾讯地图设置
UdeskConfig.useMapType = UdeskConfig.UdeskMapType.Tencent;
其它地图设置
UdeskConfig.useMapType = UdeskConfig.UdeskMapType.Other;
UdeskChatActivity是通过startActivityForResult方式进入LocationActivity,在之后选择相应信息回传到UdeskChatActivity,是通过Intent方式。
对intent.putExtra中的name做了约定,的遵守才能有效显示地理位置信息。
具体约定:
public static class UdeskMapIntentName {
//选中的位置
public static final String Position = "udesk_position";
//选中位置周边位置的截图存储的本地路径
public static final String BitmapDIR = "udesk_bitmap_dir";
//选中位置的纬度
public static final String Latitude = "udesk_latitude";
//选中位置的经度
public static final String Longitude = "udesk_longitude";
}
具体的例子如deom提供的代码片段
.setUseMap(set_usemap.isChecked()) //是否使用发送位置功能 true表示使用 false表示不使用
.setUseMapSetting(UdeskConfig.UdeskMapType.GaoDe, LocationActivity.class, new ILocationMessageClickCallBack() {
@Override
public void luanchMap(Context context, double latitude, double longitude, String selctLoactionValue) {
Intent intent = new Intent();
intent.putExtra(UdeskConfig.UdeskMapIntentName.Position, selctLoactionValue);
intent.putExtra(UdeskConfig.UdeskMapIntentName.Latitude, latitude);
intent.putExtra(UdeskConfig.UdeskMapIntentName.Longitude, longitude);
intent.setClass(context, ShowSelectLocationActivity.class);
context.startActivity(intent);
}
})
注意:需要使用视频功能,一定需要使用UdeskSDKUI IM中功能 ,但可以单独使用UdeskSDKUI功能
在你的app中 在依赖udeskvideo 模块。
demo中的代码片断
``` java
.setExtreFunctions(getExtraFunctions(), new IFunctionItemClickCallBack() {
@Override
public void callBack(Context context, ChatActivityPresenter mPresenter, int id, String name) {
if (id == 21) {
mPresenter.sendTxtMessage("发送一条消息");
} else if (id == 22) {
mPresenter.sendTxtMessage("打开表单留言");
UdeskSDKManager.getInstance().goToForm(getApplicationContext(), UdeskSDKManager.getInstance().getUdeskConfig());
}
}
})//在more 展开面板中设置额外的功能按钮
说明:一个功能按钮设置成一个FunctionMode, 包含属性
//显示内容
private String name;
//用来映射选择后对应的操作 id值 前20 是udesk 预留的, 客户自定义添加的,用于返回后根据id值建立映射关系
private int id;
//如 R.drawable.udesk_001
//显示的图标
private int mIconSrc ;
提供的自定义后续功能操作 :直接发送文本,图片,视频,文件,地理位置,商品信息
根据接口回调返回的 参数进行调用方法操作 ChatActivityPresenter mPresenter
1.发送文本消息
public void sendTxtMessage(String msgString)
mPresenter.sendTxtMessage( msgString)
2.发送图片消息
public void sendBitmapMessage(Bitmap bitmap)
mPresenter.sendBitmapMessage(bitmap)
3.发送文件类的消息( 包含视频 文件 图片)
/**
* @param filepath
* @param msgType 图片:UdeskConst.ChatMsgTypeString.TYPE_IMAGE
* 文件:UdeskConst.ChatMsgTypeString.TYPE_File
* MP4视频: UdeskConst.ChatMsgTypeString.TYPE_VIDEO
*/
public void sendFileMessage(String filepath, String msgType)
mPresenter.sendFileMessage(filepath,UdeskConst.ChatMsgTypeString.TYPE_IMAGE)
mPresenter.sendFileMessage(filepath,UdeskConst.ChatMsgTypeString.TYPE_File)
mPresenter.sendFileMessage(filepath,UdeskConst.ChatMsgTypeString.TYPE_VIDEO)
4.发送地理位置信息
public void sendLocationMessage(double lat, double longitude, String localvalue, String bitmapDir)
mPresenter.sendLocationMessage(lat, longitude, localvalue, bitmapDir)
5.发送录音信息
public void sendRecordAudioMsg(String audiopath, long duration)
mPresenter.sendRecordAudioMsg(audiopath,duration)
```
代码片断
``` java
.setNavigations(set_use_navigation_view.isChecked(), getNavigations(), new INavigationItemClickCallBack() {
@Override
public void callBack(Context context, ChatActivityPresenter mPresenter, NavigationMode navigationMode) {
if (navigationMode.getId() == 1) {
UdeskSDKManager.getInstance().toLanuchHelperAcitivty(getApplicationContext(), UdeskSDKManager.getInstance().getUdeskConfig());
} else if (navigationMode.getId() == 2) {
mPresenter.sendTxtMessage(UUID.randomUUID().toString());
mPresenter.sendTxtMessage("www.baidu.com");
}
}
})
```
说明:导航栏一个功能按钮设置成一个NavigationMode, 包含属性 //文字的显示内容 private String name; //用来映射选择后对应的操作 private int id;
支持自定义的功能 同 功能按钮
**Product字段属性说明**
key | 是否必选 | 说明 |
---|---|---|
name | 必选 | 商品名称 |
url | 可选 | 商品跳转链接(新页显示),如果值为空,则不能点击 |
imgUrl | 可选 | 商品显示图片的url |
params | 可选 | 参数列表 |
ParamsBean.text | 可选 | 参数文本 |
ParamsBean.color | 可选 | 参数颜色值,规定为十六进制值的颜色 |
ParamsBean.fold | 可选 | 是否粗体 |
ParamsBean.breakX | 可选 | 是否换行 |
ParamsBean.size | 可选 | 字体大小 |
用法场景:
1 可以每次进入会话, 通过UdeskConfig配置,设置一条商品消息,
2 可以通过导航栏 自定义功能按钮 发送商品消息
先要确认客服没有关闭会话。
我们产品逻辑: 假设客户A 选了客服组B下的客服B1,进行会话。 之后客户A退出会话界面,进入另外界面,之后通过客服组C下的客服C 1分配会话: 这时 后台会判断,如果和B1会话还存在,则会直接分配给B1,而不会分配給客服C 1。 只有B1会话关闭了,才会分配給客服C1。
出现这种情况,是客服传的sdktoken值一样。 sdktoken像身份证一样,是用户唯一的标识。让客户检查接入是传入的sdktoken值。
如果设置了email 或者 cellphone 出现相同也会在一个客服的会话里。
这个问题的可能情况之一: 手机时间设置和当前时间不一致造成的。时间误差超过一小时,必然会出现链接不上机器人界面。
检查是否加分包策略:
由于Android的Gradle插件在Android Build Tool 21.1开始支持使用multidex,所以我们需要使用Android Build Tools 21.1及以上版本,修改app目录下 的build.gradle文件,有两点需要修改。
(1)在defaultConfig中添加multiDexEnabled true这个配置项。
(2)在dependencies中添加multidex的依赖: compile ‘com.android.support:multidex:1.0.0’
(3)继承Application,然后重写attachBaseContext方法,并在AndroidManifest.xml的application标签中进行注册。
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
5.h5接入参考例子
https://github.com/udesk/udesk_android_sdk_h5
Udek系统帮助中心后台可以创建帮助文档,客户通过帮助中心可查看相关文档。调用以下接口启动帮助中心界面
UdeskSDKManager.getInstance().toLanuchHelperAcitivty(getApplicationContext(), UdeskSDKManager.getInstance().getUdeskConfig());
UdeskConfig.Builder builder = new UdeskConfig.Builder();
更新系统默认客户字段,昵称、邮箱、电话、描述
Map<String, String> info = new HashMap<String, String>();
info.put(UdeskConst.UdeskUserInfo.NICK_NAME,"更新后的昵称");
//更新后的邮箱
info.put(UdeskConst.UdeskUserInfo.EMAIL,"[email protected]");
//更新后的手机号
info.put(UdeskConst.UdeskUserInfo.CELLPHONE,"15651818750");
info.put(UdeskConst.UdeskUserInfo.DESCRIPTION,"更新后的描述信息")
info.put(UdeskConst.UdeskUserInfo.CUSTOMER_TOKEN,"对应的custom_token 不要乱传")
//传入需要更新的Udesk系统默认字段
注意更新邮箱或者手机号码,如果在后端有同样的手机号或邮箱,则会更新失败
builder.setUpdateDefualtUserInfo(info)
文本型字段示例:
{
"field_name": "TextField_684",
"field_label": "地址",
"content_type": "text",
"comment": "字段描述",
"options": null,
"permission": 0,
"requirment": false
}
取该json中字段“field_name”对应的value值作为自定义字段key值进行赋值。 示例如下:
updateTextFieldMap.put("TextField_684","北京西城区");
//传入需要更新的自定义文本字段
builder.setUpdatedefinedUserTextField(updateTextFieldMap);
选择型字段示例
{
"field_name": "SelectField_457",
"permission": 0,
"comment": "这是描述",
"requirment": true,
"content_type": "droplist",
"field_label": "性别",
"options": [
{
"0": "男"
},
{
"1": "女"
}
]
}
取该json中字段“field_name”对应的value值作为自定义字段key值进行赋值,取"options"中的某一项key值作为value,示例如下:
updateRoplistMap.put("SelectField_457","1");
//传入需要更新的自定义下拉列表字段
builder.setUpdatedefinedUserRoplist(updateRoplistMap);
在客户与客服对话时,经常需要将如咨询商品或订单发送给客服以便客服查看。
咨询对象目前最多支持发送4个属性(detail,image,title,url),如下以商品举例说明
//创建咨询对象的实例
UdeskCommodityItem item = new UdeskCommodityItem();
// 咨询对象主标题
item.setTitle("木林森男鞋新款2016夏季透气网鞋男士休闲鞋网面韩版懒人蹬潮鞋子");
//咨询对象描述
item.setSubTitle("¥ 99.00");
//左侧图片
item.setThumbHttpUrl("https://img.alicdn.com/imgextra/i1/1728293990/TB2ngm0qFXXXXcOXXXXXXXXXXXX_!!1728293990.jpg_430x430q90.jpg");
// 咨询对象网络链接
item.setCommodityUrl("https://detail.tmall.com/item.htm?spm=a1z10.3746-b.w4946-14396547293.1.4PUcgZ&id=529634221064&sku_properties=-1:-1");
builder.setCommodity(item);
//发送咨询对象信息 见ChatActivityPresenter类中的sendCommodityMessage方法
public void sendCommodityMessage(UdeskCommodityItem commodityItem) {
UdeskMessageManager.getInstance().sendComodityMessage(buildCommodityMessage(commodityItem),
mChatView.getAgentInfo().getAgentJid());
}
在退出对话界面后,没有断开与Udesk服务器的连接,注册获取未读消息事件方法,之后在该方法中可以收到未读消息。
注册方法"OnNewMsgNotice"
UdeskMessageManager.getInstance().event_OnNewMsgNotice.bind(this, "OnNewMsgNotice");
OnNewMsgNotice方法的实现
public void OnNewMsgNotice(MsgNotice msgNotice) {
if (msgNotice != null) {
NotificationUtils.getInstance().notifyMsg(UdeskCaseActivity.this, msgNotice.getContent());
}
}
注意:1 消息上报的对象是:MsgNotice ;2 注册的方法和实现的方法 字符串必须保证一致分大小写;
3 实现的方法 必须public修饰。
sdk 3.2.0版本开始,可在退出对话界面后,没有断开与Udesk服务器的连接,可获得这个会话的未读消息数,打开对话界面后未读消息数会清空。
UdeskSDKManager.getInstance().getCurrentConnectUnReadMsgCount();
sdk初始化成功,创建客户后,调用此接口可删除当前客户的聊天记录信息
UdeskSDKManager.getInstance().deleteMsg();
如果开发中,想在控制台看当前客户与Udesk服务器连接(xmpp)的交互报文,调用如下接口可实现
//true 表示开启控制台日志 false表示关闭控制台日志
UdeskSDKManager.getInstance().isShowLog(true);
App运行时如果需要客服离线或不再接收客服消息,调此接口可以主动断开与Udesk服务器的的连接。
UdeskSDKManager.getInstance().disConnectXmpp();
quitmode: mark (默认,标记放弃)/ cannel_mark(取消标记) / force_quit(强制立即放弃)
build.setUdeskQuenuMode(quitmode);
聊天界面UdeskChatActivity中的MessageAdatper,展示语音,文本,图片等消息。
udesk_chat_msg_item_txt_l,//文本消息左边的UI布局文件
udesk_chat_msg_item_txt_r,//文本消息右边的UI布局文件
udesk_chat_msg_item_audiot_l,//语音消息左边的UI布局文件
udesk_chat_msg_item_audiot_r,//语音消息右边的UI布局文件
udesk_chat_msg_item_imgt_l,//图片消息左边的UI布局文件
udesk_chat_msg_item_imgt_r,//图片消息右边的UI布局文件
udesk_chat_msg_item_redirect,//转移消息提示信息UI布局文件
udesk_chat_rich_item_txt,//富文本消息UI布局文件
udesk_im_commodity_item //显示广告商品信息的UI布局文件
对应的ViewHolder分别是:
TxtViewHolder 显示文本消息;
AudioViewHolder 显示语音消息;
ImgViewHolder 显示图片消息;
RichTextViewHolder 显示富文本消息;
CommodityViewHolder 显示广告商品信息;
RedirectViewHolder 显示转移提示语信息;
其它对应的UI
UdeskHelperActivity 帮助中心界面;
UdeskHelperArticleActivity 显示一篇文章的具体内容
UdeskRobotActivity 机器人会话界面
SurvyDialogActivity 满意度对话框
UdeskConfirmPopWindow 弹出离线表单的PopWindow
UdeskPopVoiceWindow 录音的PopWindow
UdeskExpandableLayout 提示客服上下线的动画
UdeskTitleBar 标题栏
接口已开发实现,不需要再开发。
"/udesk_im/sdk/v3/im/customers.json" //创建客户信息并提交设备信息
"/api/v2/im.json"; // 创建客户信息成功后调用,获取当前顾客xmpp登录信息
"/udesk_im/sdk/v3/im/agent.json"; // 请求获取客服进行会话
"/api/v1/articles.json?sign="; //帮助中心获取文章列表的接口
"/api/v1/articles/search.json"; //帮助中心搜索获取匹配的文章接口
"/api/v2/user_fields.json"; // 获取设置顾客自定义字段的接口
"/udesk_im/sdk/v3/im/im_survey.json"; // 获取满意度评价内容的接口
"/udesk_im/sdk/v3/im/surveys.json"; //提交满意度评价的接口
"/udesk_im/sdk/v3/im/im_group.json"; // 获取客服组列表接口
"/udesk_im/sdk/v3/im/status.json"; //获取客服状态的接口
"/udesk_im/sdk/v3/im/sdk_push.json"; /控制推送状态开关的接口
当前仅支持一种推送方案,即Udesk务端发送消息至开发者的服务端,开发者再推送消息到 App。
推送消息将会发送至开发者的服务器。
设置服务器地址,请使用Udesk管理员帐号登录 Udesk,在 设置 -> 移动SDK 中设置。
//配置 是否使用推送服务 true 表示使用 false表示不使用
public static boolean isUserSDkPush = false;
UdeskSDKManager.getInstance().setRegisterId(context,"xxxxregisterId")
//保存注册推送的的设备ID
public void setRegisterId(Context context, String registerId) {
UdeskConfig.registerId = registerId;
PreferenceHelper.write(context, UdeskConst.SharePreParams.RegisterIdName,
UdeskConst.SharePreParams.Udesk_Push_RegisterId, registerId);
}
关闭和开启Udesk推送服务,Udesk推送给开发者服务端的消息数据格式中,会有 device_token 的字段。
/**
* @param domain 公司注册生成的域名
* @param key 创建app时,生成的app key
* @param sdkToken 用户唯一标识
* @param status sdk推送状态 ["on" | "off"] on表示开启Udesk推送服务, off表示关闭udesk推送服务
* @param registrationID 注册推送设备的ID
* @param appid 创建app时,生成的app id
*/
public void setSdkPushStatus(String domain, String key, String sdkToken, String status, String registrationID, String appid)
基本要求
- 推送接口只支持 http,不支持 https
- 请求已 POST 方法发送
- 请求时使用的 content-type 为 application/x-www-form-urlencoded
参数
当有消息或事件发生时,将会向推送接口传送以下数据
参数名 | 类型 | 说明 |
---|---|---|
message_id | string | 消息id |
platform | string | 平台,'ios' 或 'android' |
device_token | string | 设备标识 |
app_id | string | SDK app id |
content | string | 消息内容,仅 type 为 'message' 时有效 |
sent_at | datetime | 消息推送时间,格式 iso8601 |
from_id | integer | 发送者id(客服) |
from_name | string | 发送者名称 |
to_id | integer | 接收者id(客户) |
to_token | string | 接收者 sdk_token(唯一标识) |
type | string | 消息类型,'event' 为事件,'message'为消息 |
event | string | 事件类型,'redirect' 客服转接,'close'对话关闭,'survey'发送满意度调查 |
- 修改上传策略
- 修改拍摄功能问题
- 修改相册功能问题
- 修改键盘高度问题
- 修改评价备注问题
- 添加导航追踪
- webview 加载逻辑调整
- 机器人聊天界面滑动隐藏键盘
- 调整emoji名称
- 商品消息添加设置背景和标题行数api
- 聊天界面底部间隙调整
- 输入框样式调整
- 商品链接样式设置
- 修改数据库添加问题
- webview 适配非http/https 开头的链接
- 修改结束会话再咨询不进入无消息对话过滤问题
- 修改无消息对话过滤状态发送消息,消息状态显示问题
- 修改空文件上传问题
- 修改断网情况下延迟请求问题
- 修改无消息对话过滤状态特殊字符问题
- 修复设置欢迎语后 开启无消息对话过滤功能失效
- 优化保存消息返回8002,表示会话已经关闭的处理
- 适配某些手机9.0手机 长按发送语音时MotionEvent事件返回特殊,导致弹框未消失,产生卡顿在录音弹框的现象。
- 排队场景 发送图片 客服显示问题修复
- 排队场景, 拉对话关闭对话场景下 无法发送语音和表情失败的修复
- 开发者选项 打开保护活动 在使用流量情况下不能发送文件修复
- 客服忙碌 排队,客服在切换离线,客户这边显示离线后, 客服在上线,拉入排队会话 客服发消息 客户收到 无法发 送消息修复
- 空指针隐患的保护
- 其它优化
- 修复sdk排队中点击留言还在排队中;
- 修复排队发送文本消息后,更多得按钮隐藏了;
- 修复发送商品消息在客服端没显示;
- 优化消息的发送到达;(离开会话界面,有未收到回执的消息,会放入单例中发送)
- 支持排队时发送消息
- 替换表情
- 支持机器人 管理员配置名称
- 支持自定义渠道
- 支持设置 全局客户唯一性customer_token
- 支持离线消息显示实际发送时间
- 修改录音文件格式wav,提高客服语音转文字的准确率
- 优化无消息对话过滤消息保存
- 消息发送优化;
- 支持机器人key;
- 机器人SDK自动转人工事件
- 优化消息id的生成
- rtl的优化
- 支持商品消息
-
SDK组片图件优化;
-
SDK支持小视频;
-
支持自定义表情包;
-
支持无消息对话过滤;
-
输入区优化;
-
满意度优化;
-
SDK留言引导文案显示优化;
-
SDK横屏兼容性优化;
-
SDK支持机器人转人工按钮在x条消息后显示;
-
SDK支持给机器人传modelKey值;
-
IM图片查看支持点击返回;
-
SDK多语言支持优化;
-
重构SDK中的各种设置;
-
机器人传客户信息;
-
8.0 设置方向和设置透明属性的适配;
-
SDK(安卓)部分问题优化;
-
SDK支持消息转人工按钮;
-
sdk 发送图片加上图片后缀;
- 消息到达率优化
- 支持视频聊天
- 支持发送地理位置信息
- 欢迎语显示优化
- 支持离线直接留言;
- SDK支持返回满意度调查和支持开关设置;
- SDK支持接收和发送GIF;
- SDK支持接收和发送视频;
- SDK支持客服消息撤回
- sdk增加显示结构化消息
- 增加黑名单提示语
- sdk初始化的方法修改为 initApiKey(Context context, String domain, String appkey, String appid)
- 接入会话的方式修改 统一调用entryChat(Context context),内部处理了根据管理员在后台设置进行相应的业务流程跳转
- 之前提供的一些接入会话方式接口删除,统一使用见entryChat(Context context)
- 支持推送,
- 支持多应用
-
http协议换成https
-
增加sdk端 客户主动放弃满意度调查
- 适配android7.0
- 适配中英文,
- 增加UI配置,
- 修改连接会话的逻辑,
- 增加头像的配置,
- 界面UI的修改
- 支持黑名单的设置;
- 客服在线状态优化;
- 修复已离线的客户在手机端显示在线的;
- 支持客服头像, 支持显示发送每条消息的客服昵称;
- 支持更新用户的信息;
- 增加发送商品链接,
- 增加消息通知
- 增加未读消息的接口
- 增加android 6.0 运行权限
- 支持欢迎语设置链接
- 支持后台设置自定义链接
- 支持指定客服 id 进行分配
- 指定客服组 id 进行分配
- 新增客服转移和邀请评价功能