欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

环信easeui集成:用户昵称和用户头像总结2018

程序员文章站 2022-03-04 12:15:27
环信EaseUI 集成,集成不做描述,看文档即可,下面主要谈一些对easeui的个性化需求修改。 一、如何将App用户体系的用户名和用户头像 显示于环信的easeui 这个问题是所有人都想解决的,集成easeui之后 ,虽然大部分功能给我们做好了,但是他是显示的环信用户体系的用户名和默认的头像。 这 ......

环信EaseUI 集成,集成不做描述,看文档即可,下面主要谈一些对easeui的个性化需求修改。

 

一、如何将App用户体系的用户名和用户头像 显示于环信的easeui

  这个问题是所有人都想解决的,集成easeui之后 ,虽然大部分功能给我们做好了,但是他是显示的环信用户体系的用户名和默认的头像。

  这个用户名是唯一的,官方提供了两种方式来解决。这里我们使用用户发送消息携带扩展信息的方式来实现。

  首先看一下环信的用户体系,用户名(唯一值,easeui中显示的用户名就是他,实际上,我们自己数据库的用户体系中,就把用户的唯一id作为环信的用户名)

  环信的用户名 == 后台数据库的id  , 目的保证唯一值,区分用户信息

  App端 需要一个数据库,每一个记录有三个字段: id ,userName, userAvatar

 

  环信easeui集成:用户昵称和用户头像总结2018

  

  实现思路:

  1、发送消息的时候(一般是当前登录用户,取名用户A) ,将项目后台用户A的id、头像url和用户名字符串作为消息的扩展属性一并发送出去

        找到EaseChatFragment文件

      环信easeui集成:用户昵称和用户头像总结2018

    大致看一下,该行数范围内的代码,很明显是一个个发送各种类型消息的方法,方法内最后都调用了sendMessage()方法,

    显然我们需要在sendMessage()方法内 给 消息(message) 添加扩展属性即可 ,如下图

    环信easeui集成:用户昵称和用户头像总结2018

              添加了932-935行代码,实现了当app当前登录用户每次发消息(不管什么类型的消息)都会添加3个扩展属性,分别为发出人的用户名,用户头像,用户id

    (注意,这个id要在自己的服务器数据里是唯一的,一个用户一个id,用时要求后端开发人员在环信用该id在环信用户体系里作为唯一的用户名,保证自己服务器里一个用户对于环信用户体系里的一个用户)  

    

    总结:

    第一步,给每个发出去的消息添加3个扩展属性

    

    2、发送方处理好了,只需要给每个发出去的消息添加3个扩展属性即可,接下来就是收消息方的处理

       这里每个用户大致有3个主要界面,会话历史界面,联系人界面,单聊窗口界面。

       其中会话历史列表界面和联系人界面类似,下面只以会话历史列表界面为例,实现用户头像和用户名的显示  

       会话历史界面对应的是EaseConversationListFragment界面。

       阅读下代码,里面有一个refresh()方法,很现实就是更新列表的方法。

       注意的是,该fragment里面是没有监听消息更新的listener,则第一步先根据文档在该fragment里面添加一个消息监听

      环信easeui集成:用户昵称和用户头像总结2018

       同时,注册和注销监听

       环信easeui集成:用户昵称和用户头像总结2018

         环信easeui集成:用户昵称和用户头像总结2018

      仔细看一个EMMessageListener 里面有一个onMessageReceived(List<Message> message){}回调

      很显然,当有消息收到的时候,会执行该方法回调,同时把消息数据返回,注意这里的消息是一个集合的消息数据

         结合第一步发出去的每一个消息都带有发送人的用户名,用户头像,用户唯一id 三个信息,则这里只需要把三个信息从每一个消息message里面提取出来即可  

      环信easeui集成:用户昵称和用户头像总结2018

     代码很简单,注意这里需要用到数据库的知识,我这里使用的是 greendao , 关于数据库的学习这里就不说了,不会的童鞋可以自行去学习

       总结:

     第二步 就是一个获取每一个消息中的扩展属性,知道这个每一条消息是哪个用户发来的,他的用户名用户头像用户唯一id都可以获取到,然后存储到数据库中

 

      3、上面两步很明显了, 一个是告诉对方 我叫什么、我的头像信息、我的唯一id,一个是接收方,得到每一个消息的扩展属性进行数据库存储。

       该流程下第三步就很明显了,就是把存储的数据库信息中获取消息所属用户id的头像和名字 显示在界面上即可(id作为唯一标准)。

      ①、以会话历史列表界面(EaseConversationListFragment)为例,联系人界面类似

      找到那行关键代码:refresh()

      环信easeui集成:用户昵称和用户头像总结2018

      handler发送了一个消息,继续找对该消息的处理

      环信easeui集成:用户昵称和用户头像总结2018

      很显然,当有消息来的时候,先清空消息列表,然后加载当前消息,刷新listview

      看一下conversationListView.refresh()做了什么? ctrl+鼠标左键点击该方法代码进入了 EaseConversationList.java

      环信easeui集成:用户昵称和用户头像总结2018

      依旧是handler发送一个消息,继续查询对该消息的处理

      环信easeui集成:用户昵称和用户头像总结2018

      最后定位到了adapter.notifyDataSetChanged(),刷新列表 ,定位到EaseConversationAdapter

      总结一下,当有新消息来的时候,刷新适配器。

      到这里很显然知道该怎么做了,刷新适配器的时候,更改ui即可了

            环信easeui集成:用户昵称和用户头像总结2018

       两个if一个else,只需要改else里面部分即可,为啥? 看注释

      ①、从数据库中根据id获取用户的头像和昵称

        如果数据库中没有 ,则用默认的昵称和头像

        如果数据库中油 ,则显示,注意,环信easeui集成:用户昵称和用户头像总结2018

        可以看出原来easeui显示的用户名是环信系统里面的用户名,实际上我们把它作为数据库的id,用该id对应的用户名来显示

        显示用户名改为:环信easeui集成:用户昵称和用户头像总结2018

      ②、用户名很简单,把原本显示id的改为显示id对应的用户名字符串的即可

        头像呢,定位到EaseUserUtils.setUserAvatar()方法,如下,是easeui原来的使用方式,可以看到都用了一个默认的图片来显示头像

        环信easeui集成:用户昵称和用户头像总结2018

        则我们只需要对应在EaseUserUtils里面写一个定制的显示头像的方法 , 将第二个参数 把从数据库对应id取出的记录中的头像url替换,显示

        环信easeui集成:用户昵称和用户头像总结2018

        注意,这里Glide的使用,添加了一个.dontAnimate()的使用,用于解决特定情况下第一个不会正常显示图片的情况,算是一个小bug,可根据自身情况添加。

 

         总结:想要在会话历史列表显示实际的头像和用户名 只需要在list对应的adapter修改显示ui的部分代码即可。

      

      4、还剩一个关键的界面,将头像和用户名显示出来,就是会话界面 EaseChatFragment

        这个界面需要修改的部分:

        ①标题,修改为聊天对象的用户名,默认是环信用户体系中聊天用户的用户名,即数据库存的三个扩展属性的id

        ②发送的消息,即app当前用户发出去的item的头像和用户名,右侧部分

        ③接受的消息,即app其他用户发过来的item的头像和用户名,左侧部分

        下面按顺序解决,

       先定位到聊天界面的layout : ease_fragment_chat.xml

       环信easeui集成:用户昵称和用户头像总结2018

          环信easeui集成:用户昵称和用户头像总结2018

       如上图,就几个view

       很显然,EaseTitleBar 就是聊天界面上的标题

        其他,EaseChatMessageList是聊天item的列表

       主要修改这两处view的使用

       ctrl+鼠标左键定位到EaseTitleBar这个自定义控件位置

       环信easeui集成:用户昵称和用户头像总结2018

       在ctrl+鼠标左键点击EaseTitleBar看一下这个控件哪里有用到

       环信easeui集成:用户昵称和用户头像总结2018

       跟聊天有关,那很显然就是EaseBaseFragment了,查看一下该文件代码,这个fragment是一个抽象类,有两个方法initview setUpView ,而EaseChatFragment继承了该类

          环信easeui集成:用户昵称和用户头像总结2018

 

        则再回到easeChatFragment里面 查询一下setUpView 和 initView的使用

        环信easeui集成:用户昵称和用户头像总结2018

 

           到这里就很显然了,环信easeui集成:用户昵称和用户头像总结2018 这便是单聊情况下的if

         easeui原代码是灰色注释掉的部分,可以看到titleBar显示的是用户的用户名,即环信用户体系中的用户名,而我们把他作为id,唯一值

        所以在这里还是根据这个id来去数据库中找寻id对应的用户名 setTitle()进去即可,修改聊天界面标题为对方用户名就是这么简单。

 

        接下来是修改聊天界面的发送方和接收方的头像问题。

          这个具体找到代码的思路就不介绍了,比较麻烦,直接定位到想要代码吧

        环信easeui集成:用户昵称和用户头像总结2018

        这里就是各种类型的消息的item的自定义控件,都继承自EaseChatRow类

        然后研究一下EaseChatRow类 ,发现了关键代码

        环信easeui集成:用户昵称和用户头像总结2018

        比较容易看懂,当消息是发出去的时候,调用了一个现实头像的方法,当消息是接收的时候,定义了一个现实头像和用户名的方法

        那解决方法,就是从该处在数据库中根据id获取到头像和用户名的数据显示即可。

           思路如此,不在细讲

         

 

 

 

、如何从library中调用app中的方法?

   当依赖easeui的时候,是用import module的形式导入的,所以主程序是可以调用easeui类库中的类和方法,但是反之不行

    当数据库操作的时候,发现该问题,解决办法就是反射调用,具体查询相关文章

   环信easeui集成:用户昵称和用户头像总结2018

 

三、easeui头像都是方形的,如果修改为原型显示?

   找一个用到显示头像的xml代码

   环信easeui集成:用户昵称和用户头像总结2018

    可以看到easeui使用了一个自定义控件来显示EaseImageView

    查看该控件源码:

   环信easeui集成:用户昵称和用户头像总结2018

   发现

   环信easeui集成:用户昵称和用户头像总结2018

     说明该控件的shapeType属性是来控制图片是方形显示还是圆形显示的。

   查询源码发现init()方法对该属性进行了初始话,默认值为0 ,如果想圆形显示,则改为1即可

    环信easeui集成:用户昵称和用户头像总结2018

         如此一来,不该显示图片的控件,不该每一个调用控件的自定义属性 即可实现统一圆形显示。

 

 

 

其他注意点:

1、环信用户注册需要交给服务器注册用户的同时去注册

2、环信登录和注销sdk的使用在App 客户端实现,同步于App用户的登录和退出

3、第一次会话发起的时候,此时发消息的和收消息的用户的数据可能不在数据库中存在,需要在这个情景之下单独先进行双方的数据存储   

4、上面讲到一个接收到新消息的回调方法  onMessageReceived  

  会有一种情况。B用户尚未登录APP, A用户给B用户发了消息(两个用户之间是第一次会话,并且是A给B发起的会话,也就是说B用户那边是没有数据库存储A用户的三个信息的),B用户登录消息之后 会有消息列表,但是因为没有执行

  onMessageReceived 方法,导致没有对A用户的消息中的扩展数据进行数据库存储,所以会导致B用户这边会话列表中A用户的头像和用户名显示不出,解决办法 定位到EaseConversationListFragment类中的 loadConversationList 方法

  查看源码得知会话列表刷新的时候都会执行,那就在这个方法中对所有的消息的扩展字段进行数据库存储,且只有第一次创建该fragment的时候才执行存储

   环信easeui集成:用户昵称和用户头像总结2018

    onCreate()中

   boolean isLoadData = false; // 是否已经缓存了数据  用于界面刚登陆的时候 对之前接受到的数据的处理

--------------------------------------------------------------------------------------------------------------------------------------------------------

 

有问题欢迎加Android群探讨。。