使用环境:在获取会话列表之后,就可以收集到两个数据,聊天的类型和聊天的对象。

携带这两个参数跳转到聊天的ChatActivity之后,这哥Activity中就布局只是设置了一个占位FrameLayout,替换了一个Fragment   ::chatFragment

ChatFragment,是聊天的重中之重。

本篇主要就是我针对聊天对话页面ChatFragment的理解,如有失误纯属巧合。

1 chatFragment  extends EaseChatFragment   -----> extends EaseBasrFragment

   从这里就可以看出,集成了EaseUI库的方便,什么方法直接去调就可以了。而在这里我是集成的SDK,所以很多方法就是自己找到方法之后复制的。没什么用。

  在父类EaseBaseFragment中知道:

  a: 在OnActivityCreated()方法中添加了一个titleBar头布局到显示这哥继承了EaseBaseFragment的activity

  b:  在onActivityCreated()方法中调用了两个方法initView() 和 setUpView()

  别的看不懂。

 在EaseChatFragment中得知:依赖EaseUI真是好! 很多页面都是已经写好的。



2   在ChatFragment中对于各种方法的理解

260行

@Override
public void onEnterToChatDetails() {if (chatType == Constant.CHATTYPE_GROUP) {//1 获取群组聊天的对象
        EMGroup group = EMClient.getInstance().groupManager().getGroup(toChatUsername);
        if (group == null) {// 2 对这个对象进行判断,如果这个聊天对象是空的,就谈吐司说明这个群组不存在。
            Toast.makeText(getActivity(), R.string.gorup_not_found, Toast.LENGTH_SHORT).show();
            return;
        }//  3 如果群组不为空,就跳转到GroupDetailsActivity界面,
        // 并携带参数groupid,就是群组的名称,
        // 还有一个参数REQUEST_CODE_GROUP_DETAIL,== 13 ;
        startActivityForResult((new Intent(getActivity(), GroupDetailsActivity.class).putExtra("groupId", toChatUsername)),
                REQUEST_CODE_GROUP_DETAIL);
    }else if(chatType == Constant.CHATTYPE_CHATROOM){//4 如果聊天类型是聊天室,就跳转到ChatRoomDetailsActivity界面,并携带roomId就是聊天室的名称
       startActivityForResult(new Intent(getActivity(), ChatRoomDetailsActivity.class).putExtra("roomId", toChatUsername), REQUEST_CODE_GROUP_DETAIL);
    }
}

而这里的chatType怎么来的,在

@Override
public void onActivityCreated(Bundle savedInstanceState) {fragmentArgs = getArguments();
    // check if single chat or group chat
    chatType = fragmentArgs.getInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_SINGLE);
    // userId you are chat with or group id
    toChatUsername = fragmentArgs.getString(EaseConstant.EXTRA_USER_ID);

    super.onActivityCreated(savedInstanceState);
}


发现这个是从fragmentArgs中get出来的,前面的参数意思是聊天类型是chatType类型,前边判断过如果是聊天室就传递一个,是群组聊天就传递一个值;第二个参数是如果前面的值是没有的,就默认返回第二个参数,第二个参数的意思是单聊模式的chatType.

另外获取了聊天对象的名称toChatUsername;

注意: 这里的fragmentArgs是一个Bundle 类型的对象。

他的由来是3;


 3   因为在chatActivity 中,activity接受到了intent传递过来的数据之后调用了chatFragment的一个方法,所以尽管chatFragment中代码众多,先从这哥方法入手。

toChatUsername = getIntent().getExtras().getString("userId");
//use EaseChatFratFragment
chatFragment = new ChatFragment();
//pass parameters to chat fragment
//将聊天对象传递到chatFragment中
chatFragment.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add(R.id.container, chatFragment).commit();

setArguments();

 这里传递的是什么我不知道,或许后边会知道。但是在跳转到ChatActivity()的时候,从获取的会话列表中得到了两个数据,会话的chat_type 和 会话的userId。

如果是聊天类型chat_type是聊天室类型就做个判断: 

是聊天室 就传递3,是群聊就传递2,如果是单聊就传递1 或者不用传递,这个是需要自己判断。

而userId,就是会话列表的名字。username;


4  在猜测到这个方法传递的数据以后,到chatFragment中的

onActivityCreated()

方法中得到了传递进来的聊天类型和聊天对象 的名称。

这里的线索就是chatType



5 首先找最简单的单聊界面。

而且,从单聊的文字聊天开始做。


做一个工作计划:

先做聊天文字聊天,以及相关的监听等。


在将文字聊天的方法抽出来单独的做成一个类,然后调用文字发送的方法发送成功。


语音聊天信息传递,成功了以后做成工具方法抽取出来,并测试调用工具类发送语音成功。

最后在做是视频,发送共享位置,图片等。

回归正题:

单聊文字聊天

5.1  文字聊天的布局:

在聊天的界面是一个ListView展示信息,展示信息就需要用到Adapter,这个信息ListView的Adapter就是EaseMessageAdapter,在这个Adapter类中提及了不同类型信息的创建方法:


文字信息分大信息  :EaseChatRowBigExpression

文字信息小信息: EaseChatRowText

位置信息:  EaseChatRowLocation

文件信息:EaseChatRowFile

图片信息:EaseChatRowImage

声音信息:EaseChatRowVoice

视频信息:EaseChatRowVideo

在每个条目中需要设置点击事件,就是说如果点击了聊天信息数据列表中的个人头像需要跳转到这个人的个人信息页面,然后这个页面需要显示下是否添加这个人为好友。

在Adapter赋值的时候设置点击事件。这只是个猜想,明天再说吧!


在环信demo中

EMConverstaion  得到EMMessage 的方法:

 */EMConversation mConversation
mConversation = EMClient.getInstance().chatManager().getConversation(toChatUsername, null, true);
// 设置当前会话未读数为 0
mConversation.markAllMessagesAsRead();
int count = mConversation.getAllMessages().size();

获取最后一天信息的方法

EMMessage message = mConversation.getLastMessage();
EMTextMessageBody body = (EMTextMessageBody) message.getBody();

获取信息列表的方法

   先获取会话:EMClient.getInstance().chatManager().getConversation();

List<EMMessage> messages = mConversation.getAllMessages();

在EMConversation中获取所有信息地方法:

public List<EMMessage> getAllMessages() {if(this.getCache().isEmpty()) {EMAMessage var1 = this.emaObject.latestMessage();
        ArrayList var2 = new ArrayList();
        if(var1 != null) {var2.add(new EMMessage(var1));
        }this.getCache().addMessages(var2);
    }return this.getCache().getAllMessages();
}

从EMMessage 获取信息的方法:

EMMessage message = mConversation.getLastMessage();
EMTextMessageBody body = (EMTextMessageBody) message.getBody();
String info = body.getMessage();

看到这里,简单的文字会话已经没什么问题了。

剩下 的以后再说……









环信即时通信聊天理解相关推荐

  1. 安卓开发环信即时通信,聊天软件-可实现单聊群聊

    最近花了一个星期的时间在B站跟着老师学了环信即时聊天工具的使用 附上学习网站:https://www.bilibili.com/video/BV1cW411V7yd?p=1 附上自己的代码 https ...

  2. 环信即时通信jdk,java版本服务器端的集成

    最近用到了环信即时通信云服务,在服务器集成的时候遇到了一些麻烦在这里记录一下: 首先,通过查看环信的开发者文档,地址在这里:http://docs.easemob.com/doku.php?id=st ...

  3. SpringBoot+Dubbo+环信(即时通信)整合

    SpringBoot+Dubbo+环信(即时通信)整合 1.注册环信账号 官网:https://www.easemob.com/ 稳定健壮,消息必达,亿级并发的即时通讯云 2. 了解平台架构 文档地址 ...

  4. Android环信即时通信集成全过程(含demo)

    最近闲来无事,就使用环信提供的文档写了一篇详细的即时通信的软件, ok 为了感谢老东家的突出贡献 先将环信的详细文档地址贴出来: http://docs-im.easemob.com/im/andro ...

  5. 关于环信即时通信的使用小结

    因项目中涉及即时通讯的模块,老大跟我说用环信的,所以去熟悉了下后搬到项目中使用,环信文档地址点击打开链接 首先应该在AndroidManifest.xml文件中配置环信相关 <!-- 设置环信应 ...

  6. 环信即时通讯 聊天室、发红包

    1.申请环信账号   环信通讯云 2.此文章只讲 聊天室内容 3.创建连接 let conn = {}; WebIM.config = config; conn = WebIM.conn = new ...

  7. 基于python的MQTT和环信即时通信的MQTT通信

    代码如下: # -*- coding: utf-8 -*- # 以下代码在2021年10月21日 python3.10环境下运行通过 import paho.mqtt.client as mqtt i ...

  8. android环信登录成功但是收不到消息,Android环信即时通信遇到的问题及解决方法...

    导入了EaseUI遇到的问题 问题一:Error:Execution failed for task ':app:transformClassesWithDexForDebug'. > com. ...

  9. 聊天服务器 单机性能,环信即时聊天服务器

    环信即时聊天服务器 内容精选 换一换 本章节通过示例项目"小蝌蚪即时交互游戏"介绍如何使用DevCloud开发基于PHP语言的H5应用.项目名称:小蝌蚪即时交互游戏.项目简介:小蝌 ...

  10. vue2集成声网-环信即时通讯SDK,建议实现两人聊天

    1.注册登陆环信并创建用户 步骤:注册 => 登录 => 创建应用 => 创建应用用户 登录注册:环信登陆注册页面(https://console.easemob.com/user/ ...

最新文章

  1. 读《大道至简——失败的过程也是过程》有感
  2. 重整谋定电商经信研究新格局-李玉庭:人工智能精细化运营
  3. Django 函数和方法的区别
  4. 用lucene实现在一个(或者多个)字段中查找多个关键字
  5. python没有上方工具栏_PyQt5快速上手基础篇8-菜单栏、工具栏和状态栏
  6. 宅在家里写数据库中排序和分页
  7. mysql创建触发器的权限_MYSQL设置触发器权限问题的解决方法
  8. hdu 1213 “How Many Tables”(并查集基本到优化)
  9. c语言实用程序6,C语言实用程序设计100例流程图
  10. 国内百家企业SRC一览表(安全应急响应中心)
  11. 浏览器白屏原因思路分析
  12. 自然科学期刊能发表计算机论文吗,福建交通科技杂志发表论文能评职称吗
  13. linux终端联网网速慢,Linux下上网速度慢的问题及其解决方法
  14. CVTE实习求职经历
  15. 基于scrapy的智联职位爬取
  16. 拿棱镜门黑客软件攻击“俄版百度”,不偷情报只想装大V,FBI们被抓包了
  17. mysql 联合索引 abc_ABC联合索引生效问题(整理笔记!!!)
  18. 设置WINRE的硬盘启动
  19. 处理new Date()在safari浏览器上的某些日期格式导致的Invalid Date
  20. word中去除页眉中的横线

热门文章

  1. 基于vue3.0+vantUI+sass实现的移动端商城
  2. 怎么通过当地时区计算格林尼治_地球运动之“时间计算”练习二(干货)
  3. 搜索引擎(二)网页排名算法(1)PageRank
  4. MIS(管理信息系统)
  5. 【BZOJ3654】图样图森破【最长路】【后缀数组】【ST表】【回文串】【LCP】
  6. (Network Analysis)graph centrality measures
  7. npoi Excel图表制作
  8. fdisk分区以及格式化磁盘简要步骤
  9. linux格式化硬盘 中断,linux格式化硬盘【调解方案】
  10. 供水供气管道泄漏监测系统原理