Android Studio
添加依赖,在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);
}
<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 推送服务;
PS:集成时需要删除
之前的华为jar
包和推送代码,并下载新版HMS SDK
引用到自己的项目中,其中Base
和Push
两个库是必须的,其他的可以参考华为官方介绍自己决定是否添加
首先就是去华为开发者后台创建应用,并开启 push 服务,并上传对应的证书指纹,具体可以看下华为官方介绍: 华为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介绍