Android 客服工作台 SDK

开发工具

Android Studio

开源Demo源码:https://github.com/easemob/kefu-agent-android/

目录

build.gradle 配置

添加依赖,在app的build.gradle 中dependencies中加入如下(添加后需同步gradle):

android{
   ......
   defaultConfig {
     ndk {
        //选择要添加的对应cpu类型的.so库
        abiFilters 'armeabi', 'arm64-v8a'
        //还可以添加 'armeabi-v7a', 'x86'
     }
   }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //环信坐席端SDK
    implementation 'com.easemob:kefu-agentsdk-android:1.0.9r2'
    implementation 'com.google.code.gson:gson:2.8.5'
}

注意 如果在添加以上abiFilter配置后AndroidStudio有如下提示:

NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.

则需要在Project根目录的gradle.properties文件中添加:

android.useDeprecatedNdk=true

初始化

初始化需要在Application中调用,HDClient的其他方法也都需要在他后面调用 例如:DebugMode、网络通知,消息通知等
HDClient.getInstance().init(this);

设置调试模式

// 设置为true后,将打印日志到logcat, 发布APP时应关闭该选项
HDClient.getInstance().setDebugMode(true);;

登录

//uName 登录账号  uPwd 登录密码  isHiddenLogin[false|true] 在线登录|隐身登录  
HDClient.getInstance().login(uName, uPwd, isHiddenLogin, new HDDataCallBack() {});

添加移除事件监听

//事件监听,由新消息,新会话,会话关闭,账号被删除等事件组成
HDClient.getInstance().chatManager().addEventListener(eventListener);
HDClient.getInstance().chatManager().removeEventListener(eventListener);

判断是否已经登录

//APP只需要登录一次,SDK会协助自动登录,因此在进入APP时需要判断是否登录过
if(HDClient.getInstance().isLoggedInBefore()){
    //已经登录,可以直接进入主界面
}else{
    //未登录,需要登录后,再进入主界面
}

退出方法

登出后应退出客服系统或跳转到登录界面
HDClient.getInstance().logout(new HDDataCallBack() {});

添加网络监听,可以显示当前是否连接服务器

connectionListener = new HDConnectionListener() {
			@Override
			public void onConnected() {
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
					  // 正常连接到服务器
					}
				});
			}

			@Override
			public void onAuthenticationFailed(int errorCode) {
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
					// 认证失败,可能为账号被删除,可能为服务器强制下线,可能为在其他地方登录,总之,需要退到登录界面即可,此处无需再调用退出方法,直接跳转登录界面即可。
					}
				});

			}

			@Override
			public void onDisconnected() {
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
						//连接不到服务器,可能为网络不可用,可能为服务器有问题
					}
				});
			}
		};
		HDClient.getInstance().addConnectionListener(connectionListener);

//如果添加到某个Activity,需要在Activity的onDestory方法调用移除监听
if (connectionListener != null){
			HDClient.getInstance().removeConnectionListener(connectionListener);
		}

添加小米推送

  • AndroidManifest.xml配置
  • 添加MiPush.jar到项目的libs文件夹中
AndroidManifest.xml配置
<manifest>
     ...
     <!--例如: com.easemob.helpdesk.permission.MIPUSH_RECEIVE -->
    <permission
        android:name="你的包名.permission.MIPUSH_RECEIVE"
        android:protectionLevel="signature" />
    <uses-permission android:name="你的包名.permission.MIPUSH_RECEIVE" />

    <application>
    ...
    <service
            android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
            android:enabled="true"
            android:exported="true" />
        <service
            android:name="com.xiaomi.mipush.sdk.MessageHandleService"
            android:enabled="true" />

        <receiver
            android:name="com.hyphenate.chat.EMMipushReceiver"
            android:exported="true" >
            <intent-filter>
                <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.xiaomi.mipush.ERROR" />
            </intent-filter>
        </receiver>
    ...
    </application>
</mainfest>

添加华为推送

华为HMS推送集成

按照下面的说明重新集成 HMS 推送服务;

PS:集成时需要删除之前的华为jar包和推送代码,并下载新版HMS SDK引用到自己的项目中,其中BasePush两个库是必须的,其他的可以参考华为官方介绍自己决定是否添加

创建华为应用

首先就是去华为开发者后台创建应用,并开启 push 服务,并上传对应的证书指纹,具体可以看下华为官方介绍: 华为HMS消息推送服务集成

上传推送证书

注册完整后,需要在环信开发者后台上传推送证书,选择你的应用—>推送证书—>Huawei—>新增证书,然后输入你在华为开发者后台创建的应用的APPIDAPP SECRET

客户端配置 HMS

然后SDK 这里对 HMS 注册华为推送 token 进行了封装,集成时还是比较简单的,只需要在 AndroidManifest.xml 配置文件配置相关广播接收器和服务等: 记得设置自己的在华为开发者后台创建的应用的APP ID

PS:在自己实现广播接收器的时候必须继承自环信封装的那个广播接收器com.hyphenate.chat.EMHWPushReceiver,否则收不到环信的离线推送

<!--华为 HMS Config-->
        <!--华为开发者后台创建的应用的 APP ID-->
        <meta-data
            android:name="com.huawei.hms.client.appid"
            android:value="华为应用 APP ID" />
        <!--华为推送广播接收器,可以直接使用环信 sdk 封装好的,也可以继承自环信重写,如果继承自环信,实现 onToken 方法时必须要调用 super 方法-->
        <receiver android:name="com.hyphenate.chat.EMHWPushReceiver">
            <intent-filter>
                <!-- 必须,用于接收 TOKEN -->
                <action android:name="com.huawei.android.push.intent.REGISTRATION"/>
                <!-- 必须,用于接收消息 -->
                <action android:name="com.huawei.android.push.intent.RECEIVE"/>
                <!-- 可选,用于点击通知栏或通知栏上的按钮后触发 onEvent 回调 -->
                <action android:name="com.huawei.android.push.intent.CLICK"/>
                <!-- 可选,查看 PUSH 通道是否连接,不查看则不需要 -->
                <action android:name="com.huawei.intent.action.PUSH_STATE"/>
            </intent-filter>
        </receiver>

        <receiver android:name="com.huawei.hms.support.api.push.PushEventReceiver">
            <intent-filter>
                <!-- 接收通道发来的通知栏消息,兼容老版本 PUSH -->
                <action android:name="com.huawei.intent.action.PUSH"/>
            </intent-filter>
        </receiver>
        <!-- huawei push end -->

配置完这些之后,在满足条件的华为设备上就可以使用华为推送接收离线推送通知了;

故障排查

当开发者做完这些之后如果在华为设备上还是收不到推送,可以看下控制台的输出,或者环信 sdcard 上保存的日志,是否有一下日志输出:

// 当设备的华为移动服务版本比较低的时候,无法启用华为推送,会有以下输出
D/ONE SDK: [EMPushHelper] huawei mobile services is not available. please upgrade
// 当注册 token 时,华为开发者后台证书不对应,或者没有开通 Push 服务,当所有的都确认没问题后,如果还是有这样的问题,这个需要联系华为技术支持查看下是否生效
D/ONE SDK: hms service connection suspended. error: 6xxx 或 9xxxxxxxx

后边的 error 为华为官方错误码,更多错误码请参考华为官方错误表:表3-1 HMS 通用错误码及处理方式


混淆文件

混淆添加到proguard-rules.pro中

#环信客服
-keep class com.hyphenate.** {*;}
-dontwarn  com.hyphenate.**

#gson
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.* { *; }
-keep class com.google.gson.examples.android.model.* { *; }
-keep class com.google.gson.* { *;}

#nineoldandroids
-dontwarn com.nineoldandroids.*
-keep class com.nineoldandroids.** { *;}

#butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

#okhttp
-dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp.** { *;}
-dontwarn okio.**
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**

#okhttp3
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**

#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { 
  **[] $VALUES;
  public *;
}



#如添加华为push
# Huawei push
-keep class com.huawei.android.pushagent.** {*;}
-keep class com.huawei.android.pushselfshow.** {*;}
-keep class com.huawei.android.microkernel.** {*;}
-keep class com.baidu.mapapi.** {*;}
-keep class com.hianalytics.android.** {*;}
-dontwarn com.huawei.android.pushagent.**
-dontwarn com.huawei.android.pushselfshow.**
-dontwarn com.huawei.android.microkernel.**
-dontwarn com.github.mikephil.charting.data.**

#如添加小米push
#mipush
-keep class com.xiaomi.push.** {*;}
-dontwarn com.xiaomi.push.**
-keepclasseswithmembernames class com.xiaomi.**{*;}
-keep public class * extends com.xiaomi.mipush.sdk.PushMessageReceiver

更多功能

更多API,请参考API文档AndroidSDKAPI介绍