最近项目中要用到群聊的功能,了解过后最终用了环信来实现此功能,下面来说具体的集成步骤;
第一步:首先至环信官网,<a href="http://www.easemob.com/product/cs?utm_source=baidu-pp">注册后创建应用获取appKey,在申请key的过程中,发现它不像其他的第三方一样需要用到应用的唯一标识包名,所以这个key并不是和应用绑定的,别人拿去也可以直接用,当然也没有人会泄漏自己的appkey吧
。
第二步:集成的选择,现在环信android的sdk已经到3.2.1了,因为是初次集成所以直接就用了最新版本,问了他们的客服技术人员,也推荐用最新稳定版。他们有两种集成方式一种是只是用sdk,优点是自定义性强。缺点是自己要写大量ui界面,毕竟ui界面还是蛮多的呀。另外一种方式是他们有一个EaseUI库,可以进行依赖,然后就可以直接用人家的页面了,优点是减少了工作量,但是这个库代码也是蛮多的,依赖的东西也不少,有很多可能自己也用不到很不灵活。因为我的工期也是比较紧,所以我采用了“第三种”方法
。其实,就是将自己需要用的ui界面先暂时复制到自己的项目里面(先让产品同学看到效果吧)。然后再根据ui设计师的要求,进行ui优化。算是折中的方法吧。
第三步:一些配置。首先是jar和so文件。因为我只是做了群聊,所以不需要实时语音和实时视频所以选择
如图选中的部分下面的jar和so
,直接按照目录导入就好了;实质上我只导入了如下图选中的部分的so
具体原因后文会讲到。AndroidManifest中的配置如下:
当然还会有一些权限,例如录音,摄像等权限了。<!-- *******************环信所需********************** --> <meta-data android:name="EASEMOB_APPKEY" android:value="自己申请的key" /> <!-- 声明SDK所需的service SDK核心功能--> <service android:name="com.hyphenate.chat.EMChatService" android:exported="true"/> <!-- 声明SDK所需的receiver --> <receiver android:name="com.hyphenate.chat.EMMonitorReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <data android:scheme="package"/> </intent-filter> <!-- 可选filter --> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.USER_PRESENT" /> </intent-filter> </receiver>
第四步,就是正常的代码书写。其实一开始我是直接把我所需的ui代码拷贝过来了,甚至是原封不动。是想要先看到效果;
第五步:因为我做的是群聊,并且应用的一个模块就是群聊,所以环信的注册以及群的创建都是由服务端来完成了。所以客户端做的就是环信登录,以及退出登录;登录调用的是
EMClient.getInstance().login(name, pwd, new EMCallBack() { @Override public void onSuccess() { //这个是成功的回调,该方法回调后,我进入了聊天页面 } @Override public void onProgress(int progress, String status) { // EMError 错误码都在这个类里面 } @Override public void onError(final int code, final String message) { } });
我进入群聊页面时候,服务端就会给我一个群id,我好知道当前用户所在的群,以进行聊天;至此聊天功能初步完成;
接下来说遇到的几个问题,以及解决的过程。
问题一:服务端给了群id,客户端会根据id获取群信息的,环信提供了两个方法
其实第一个方法是从本地数据库获取群信息,第二个才是从服务器获取最新的群组信息;我遇到的问题是刚开始一直是用第一个方法getGroup来获取群组信息的,就会出现第一个用户退出后,第二个用户,再次登录找不到群组的情况,其实也不难理解,我们退出登录时候本地数据库中数据并未清除,另外又没有调用getGroupFromServer从远程获取,所以自然会存在根据新的id获取不到群组的情况;那好,然后我每次在进入页面之前,先调用getGroupFromServer方法同步数据(问了环信的客服技术人员,人家说这个方法是可以将数据同步至本地数据库的),无奈,调用这个方法后,有时候调用getGroup仍然是无法获取到群组信息。可能是我调用姿势不对?最后为了稳妥,我就一直用了第二个方法(注意其需要运行在子线程中)。
问题二:进入群详情页面时候,会展示群里面的成员信息。用的是GridView了,但是总会出现重复的情况,Item名字用的是用户类EaseUser的nick属性值。刚开始一直以为是gridview用的不对,可是感觉不应该呀,用了有两年了,不该有问题。最后看了下数据,原来环信服务器返回的数据有问题,,,,好吧,数据是不能相信的。原因在于传给的adapter的List<EaseUser>中的EaseUser的nick值总是相同的,所以就导致了列表重复;但是他们的userName是不重复的,所以最终就
List<EaseUser> userList = new ArrayList<>();
for (String username : members) {
EaseUser user = new EaseUser(username);
user.setNickname(username);
userList.add(user);
}这样写了,将nick和username值搞成一样的。然后就不重复了。
最后说说上面我导入so时候为啥只用了那一个文件夹;因为我的应用还用了百度地图,其中有定位、导航(包括语音)、地图展示的功能,可能用过这些综合功能的朋友知道,如果根据功能块从百度官网分别下载,最终会报so找不到的错误,所以只能组合下载,但是组合下载后,百度就会只给这一个armeabi文件夹下面的so。如果我在用环信时候,导入支持不同种类的cpu类型的so的话,在那些cpu类型为非armeabi的手机上。百度地图就会启动报错,报找不到so的错误;所以综合之后,就只用了一个文件夹,也是无奈之举;如果有哪位朋友遇到相同问题,烦请告知;
这是写的第一篇博客,以前也有想过写,可出于各种原因,都没写,最重要是没有尝试。写的有点乱。但是要勇于尝试,just
do it!
如有错误,欢迎指正,先行谢过
1万+



被折叠的 条评论
为什么被折叠?



