视频学习地址

本内容接上篇文章

我的源码:
码云
github
大加有需要可以下载来参照一下。

文章目录

  • 简介:
  • 问题、报错
  • 与视频中有差别的地方
    • 视频的第十九节
    • 视频的第38节,关于长按删除联系人,
    • 视频的39 点击联系人跳转到聊天窗口
    • 视频40
  • 总结了一些页面的设计和功能
    • (1)欢迎界面
    • (2)“我”页面
    • (3)邀请页面
    • (4)会话详情页面

简介:

参考视频学习。
在学习过程中,总结了一些遇到的问题记录在这里。

问题、报错


android {......//指定jdk版本compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}android {//use legacy for android 6.0(3.6.8版本之后移除apache library)//useLibrary 'org.apache.http.legacy'//自3.6.0开始需要java8的支持compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}
dependencies {//其他必要依赖......implementation 'io.hyphenate:hyphenate-chat:xxx版本号'
}
Duplicate class android.support.v4.app.INotificationSideChannel
found in modules classes?

解决方法:
需要在gradle.properties中添加下面两行代码
这是因为混合支持库。通过添加这些行选择androidX作为您的支持库

android.useAndroidX=true
android.enableJetifier=true

登录的时候报错
FATAL EXCEPTION: pool-3-thread-2

是因为Android Studio版本更新导致这个类没有了,在build.gradle中添加一句
implementation ‘com.android.support:support-v4:30.4.1’

注册的时候失败,报错
java.io.IOException: Cleartext HTTP traffic to 114.116.241.109 not permitted

原因是Android 9.0是默认禁止所有http请求的,需要在代码中设置如以下代码才可以正常进行网络请求。
在AndroidManifest.xml中添加,
android:usesCleartextTraffic=“true”

在导入v4包发现Fragment冲突
Duplicate class androidx.collection.ArrayMap found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-android-support-v4 (android-support-v4.jar)

可以不需要v4包,直接用androidx包下的也能实现一样的效果
如果用,导入v4包 后要把冲突包删掉

与视频中有差别的地方

基于视频,说明一下环信EaseIMKit的使用与EaseUI的差别。

视频的第十九节

不同的是我们使用的Kit库继承EaseContactListFragment。实现的页面并没有标题栏,这个需要我们自己加上去。
可以在activity_main.xml中直接添加,这样的好处是,当我们切换三个fragment的时候就都可以有标题栏了,就不用每个页面都去加一次(我代码里的方法),挺麻烦的。

<com.hyphenate.easeui.widget.EaseTitleBarandroid:id="@+id/fragment_title_bar1"android:layout_width="match_parent"android:layout_height="@dimen/ease_common_title_bar_height"app:titleBarTitle="我"android:ellipsize="marquee"android:layout_gravity="center_horizontal|center"android:background="@color/white"app:titleBarDisplayHomeAsUpEnabled="true"/>

这样子就完成了三个页面的标题栏,但是想要对应页面,应该如何设置标题栏的字体呢。
参考开发文档,只要当我们的layout中使用的是环信提供的标题栏,那么下面的方法我们就可以用,包括到后面设计聊天窗口界面的时候。

在Java代码中,设置标题栏之前,也就是使用上面的标题栏方法的时候,需要先将标题栏的layout文件添加进当前的layout。关键代码

View searchView =LayoutInflater.form(mContext).inflate(R.layout.你的layout的文件名,root)
llRoot.addView(searchView,0)
...
...
看下一张图

然后就可以用上面的方法设置操作你的标题栏啦。

在对应的的fragment中调用上面的api就可以设置标题的文字了。
比如:在ContractListFragment中想要将联系人列表页面的标题栏设置为“联系人”

(添加右侧图标)是添加➕的方法,和➕的点击事件

添加搜索框的方法就是框出来这一段,我当时是直接在搜索框的layout中添加头部栏,这不太好,破环了搜索框的layout,建议大家用上面的方法添加头部栏

完成这两部分,就实现了添加头部栏和搜索框啦。

视频的第38节,关于长按删除联系人,

直接重写该方法,不需要像视频里那样 绑定各种东西

menuHelper.addItemMenu() 可以添加多个弹出的选项
case代表选择了弹出的选项是是哪一个

这些都可以去开发文档找到

视频的39 点击联系人跳转到聊天窗口

也是直接重写封装好的点击联系人的方法,不需要像视频中那样。

视频40

ChatFragment继承了EaseConversationListFragment后**已经实现了监听会话消息变化和刷新,**所以这个不用再重复做了。主要是点击条目跳转待对应的聊天窗口。

这里与视频的差距是EaseIMKit重写onItemClick(View view, int position)方法的参数和EaseUI不一样,这里需要去得到相应的参数,就可以实现同样的功能。

在会话列表界面,如何实现点击某个联系人能跳转到与该联系人的会话窗口界面?
会话列表使用listView实现,每个联系人对应着一个list条目,从上往下条目为序序列,从0到n。重写条目的点击事件方法 OnItemClick(View view,int positon),view是条目的视图,position是点击的条目在listview中的位置,是第几条。
传入position来调用conversationListLayout.getItem(position)方法可以拿到该条目的所有信息。
//获取到该条目的所有数据
EaseConversationInfo conversationInfo = conversationListLayout.getItem(position);
从所有信息中取出该条目的会话的信息
//拿到该条目的会话信息
EMConversation conversation = (EMConversation) conversationInfo.getInfo();
从会话信息中取出该条目的唯一标识hxid
//传递参数 会话信息id =hxid
intent.putExtra(EaseConstant.EXTRA_CONVERSATION_ID, conversation.conversationId());
然后startActivity()就能跳转到对应的朋友的聊天窗口了

ChatFragment完整代码:

package com.example.im.controller.fragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import androidx.core.content.ContextCompat;
import com.example.im.R;
import com.example.im.controller.activity.AddContactActivity;
import com.example.im.controller.activity.ChatActivity;
import com.hyphenate.chat.EMConversation;
import com.hyphenate.easeui.constants.EaseConstant;
import com.hyphenate.easeui.modules.conversation.EaseConversationListFragment;
import com.hyphenate.easeui.modules.conversation.model.EaseConversationInfo;
import com.hyphenate.easeui.utils.EaseCommonUtils;
import com.hyphenate.easeui.widget.EaseTitleBar;
import static com.hyphenate.easeui.widget.EaseImageView.ShapeType.RECTANGLE;
//会话列表页面
public class ChatFragment extends EaseConversationListFragment {@Overridepublic void initView(Bundle savedInstanceState) {super.initView(savedInstanceState);//添加搜索布局和标题栏addSearchView();//设置默认头像conversationListLayout.setAvatarDefaultSrc(ContextCompat.getDrawable(mContext,R.drawable.toux));//设置头像样式:0为默认,1为圆形,2为方形(设置方形时,需要配合设置avatarRadius,默认的avatarRadius为50dp)conversationListLayout.setAvatarShapeType(RECTANGLE);//设置圆角半径conversationListLayout.setAvatarRadius((int) EaseCommonUtils.dip2px(mContext, 5));}private void addSearchView() {//添加搜索会话布局View searchView = LayoutInflater.from(mContext).inflate(R.layout.contract_search, null);llRoot.addView(searchView,0);//获取控件EaseTitleBar titleBar=findViewById(R.id.fragment_title_bar);//设置标题titleBar.setTitle("会话列表");//添加右侧图标titleBar.setRightImageResource(R.drawable.em_contact_menu_add);}/*** 逻辑:点击第position个条目触发该条目的监听器** @param view* @param position 该参数是条目的位置,从上往下,从零开始计数*///设置条目的点击事件@Overridepublic void onItemClick(View view, int position) {super.onItemClick(view, position);Intent intent = new Intent(getActivity(), ChatActivity.class);//获取到该条目的所有数据EaseConversationInfo conversationInfo = conversationListLayout.getItem(position);//拿到该条目的会话信息EMConversation conversation = (EMConversation) conversationInfo.getInfo();//传递参数   会话信息id =hxidintent.putExtra(EaseConstant.EXTRA_CONVERSATION_ID, conversation.conversationId());//会话类型,是否是群聊if (conversationInfo.isGroup()) {intent.putExtra(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_GROUP);}startActivity(intent);}//刷新消息}

总结了一些页面的设计和功能

(1)欢迎界面

使用的控件:
·ImageView,图片充满
·TextView,布局在上级控件的中间,
距离底部100dp

·设置顶部状态栏为透明:
getWindow().getDecorView().setSystemUiVisibility
(View.SYSTEM_UI_FLAG_LAYOUT_
HIDE_NAVIGATION);

(2)“我”页面

整体为线性布局,垂直排列。

头像、设置、关于都是插入线性布局,放入
ImageView显示图片和显示字体的TextView
退出为Button按钮。

功能:

①显示当前用户的名称:
·获取名称:EMClient.getInstance().getCurrentUser()
·然后用TextView控件的setText()方法将当前用户的
·名称显示出来。
②点击退出按钮注销登录,回到登录界面:
·因为这是一个联网操作,需要开一个线程,去登录
环信服务器告诉服务器要执行退出登录
EMClient.getInstance().logout(false, new EMCallBack() ) 这里重写了三个方法,在退出成功的方法里onSuccess()实现回到登录界面,同时finish()当前的Activity。

Layout的textAllCaps=”false” 让模拟器显示英文大小写。

(3)邀请页面

①设计:

·用ListView将历史记录(其他用户点击发送邀请信息广播后,将邀请信息保存在本地的数据库)展示出来。
·每个条目带有两个按钮,绑定了监听器,用来实现逻辑处理。
·注册了联系人变化的监听器,当前页面有新的邀请时,或者点击接受或拒绝时,刷新该页面。
·用适配器初始化ListView,
·按钮的变化:当有新的邀请时,设置当前条目的两个按钮显示,默认是隐藏。点击接受后,成功添加,并设置隐藏两个按钮,并刷新页面;点击拒绝,则直接删除该条记录,并刷新页面。

②用了适配器,且配置了ViewHolder。
·ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。当convertView不为空的时候直接重新使用
convertView从而减少了很多不必要的View的创建,然后加载数据。

·这些邀请信息和接受拒绝的信息都是通过环信的服务器来传递。

·点击接受按钮,通知环信服务器点击了接受按钮
EMClient.getInstance().contactManager().acceptInvitation(invitationInfo.getUser().getHxid());

·然后更新本地数据库。
Model.getInstance().getDbManager().getInviteTableDao().updateInvitationStatus(InvitationInfo.InvitationStatus.INVITE_ACCEPT,invitationInfo.getUser().getHxid());

拒绝按钮同理。

(4)会话详情页面

  图3.1整体布局

布局与功能

·头部栏左右两边添加了ImaButton,点击可以触发事件,不过还没有设置,中间用来显示当前聊天的用户、或者群组的名字。图3.1。
·底部为聊天栏这是环信提供的,布局是一个水平的线性布局,三个ImageButton和一个ImageView组成。图3.1。
·点击麦克风按钮后将其切换到图3.2的另一个水平线性布局,这是由四个ImageButton组成。
·点击笑脸按钮,弹出一个循环视图(RecyclerView)里面放置了线性排列的表情,点击进行匹配后会在ImageView中显示该表情。
·加号按钮同理。

   图3.2 底部栏(1)

当ImageView里有内容时,出发监听器将加号按钮改成发送图3.3。
·聊天记录的展示用的时ListView来实现,因为聊天信息需要联网发送到服务器。所以开启消息漫游,先从服务器中获取聊天记录,然后保存到本地数据库,再从本的

图3.3 底部栏(2)
数据库加载信息展示出来。
·当第二次打开该页面的时候,会先判断本地数据库
中是否有聊天记录,如果有就直接加载,没有的话再开启
消息漫游。当一直往上翻聊天记录时只会去加载数据库中的记录。

  • 在EaseChatMessageListLayout中设置
  • 三种数据加载模式,local是从本地数据库加载,Roam是开启消息漫游,History是搜索本
  • 地消息/*
    public enum LoadDataType {
    LOCAL, ROAM, HISTORY
    }

还可以设置消息条目的展示位置
EaseChatFragment类下的initView()方法
chatLayout.getChatMessageListLayout().setItemShowType(EaseChatMessageListLayout.ShowType.NORMAL)

 * normal:区分发送方(在右侧)和接收方(在左侧)* left发送方和接收方在左侧* right发送方和接收方在右侧
public enum ShowType {NORMAL, LEFT/*, RIGHT*/
}

JAVA开发Android聊天APP,实现了类似QQ、微信的即时通讯功能相关推荐

  1. 用sockets打造自己的Android聊天app(安卓篇)

    用sockets打造自己的Android聊天app(安卓篇) 翻译自http://www.androidhive.info/2014/10/android-building-group-chat-ap ...

  2. 从零开始开发Android相机app(三)简单介绍图像滤镜功能

    目前章节 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机app(三)简单介绍图像滤镜功能 文 ...

  3. 开发社交聊天APP需要注意什么?如何快速开发聊天功能

    随着互联网的发展,人们的沟通方式也在悄悄发生变化,由原来的面对面沟通,发展为网上沟通.让大家日常生活的通讯越来越方便了,各种APP层出不穷.那么,想开发一款社交聊天并进行运营,需要注意哪些方面?如何快 ...

  4. java开发机器人聊天_聊天机器人与Web开发的未来

    java开发机器人聊天 Since Facebook launched their annual F8 conference for bot developers in 2016 and Micros ...

  5. react native开发Android 篇——APP名称、图标、启动页

    react native开发Android 篇--APP名称.图标.启动页 设置APP名称 设置APP图标 设置启动页 隐藏启动页 设置APP名称 编辑 android/app/src/main/re ...

  6. 基于Java的在线聊天APP系统分析及设计

    基于Java的在线聊天APP系统分析及设计 目录 基于Java的在线聊天APP系统分析及设计 1 一. 需求分析 3 核心用户分析 3 系统的主要功能的概述 3 项目操作流程图 4 功能详解 4 登录 ...

  7. android 微信浮窗实现_Android实现类似qq微信消息悬浮窗通知功能

    实现方法:(需要开启悬浮窗通知权限.允许应用在其他应用上显示) 一.利用headsup 悬挂式Notification,他是5.0中新增的,也就是API中的Headsup的Notification,可 ...

  8. IM即时通讯项目讲解(一) 实现类似qq微信表情面板无缝切换

    IM即时通讯项目讲解(一)--实现类似qq微信表情面板无缝切换 标签(空格分隔): 开源项目 ###该系列技术课程来源慕课IM实战 带后台的IM即时通讯App 全程MVP手把手打造 #####通过该课 ...

  9. 网易im即时聊天php怎么接入,网易云信IM即时通讯功能接入方式与流程_如何收费_企业服务汇...

    编者按:很多企业在考虑使用网易云信提供的IM即时通讯功能,对于企业应当如何接入该功能.接入方式和流程是怎样的.应当如何收费等不太清楚.企业服务汇通过评测网易云信IM即时通讯功能来告诉你答案. 网易云信 ...

最新文章

  1. jstack 使用(转)
  2. 扎克伯格亲自做了26张PPT,员工效率提10倍,已被疯狂传阅
  3. break continue 016
  4. 学 Python找不到练手项目?试试这些!
  5. Filter_细节_执行流程生命周期
  6. C#decimal数据类型
  7. Crusaders Quest ZOJ - 3983 构造|思维
  8. leetcode —— 40. 组合总和 II
  9. python时间段_python--时间段遍历
  10. 网页编辑器粘贴word格式的处理
  11. Nginx Location 工作流程图及总结
  12. Opengl ES Glew库 ----- By YDD的铁皮锅
  13. 基于JSP的鲜花店商城平台【数据库设计、源码、开题报告】
  14. 动画专业考一级计算机选什么语种,想成为一名出色的动画设计师吗?去美国纽约视觉艺术学院读计算机动画与视觉效果本科专业准没错!...
  15. 捷豹:车到用时方知养,可知彼时恨太迟
  16. python资产负债表_用Python清理雅虎财务资产负债表
  17. srs源码分析3-srs的启动
  18. iOS 图片裁剪(用户头像裁剪)
  19. 基于小波变换的信号去噪技术及实现
  20. WIN10下调用waveInOpen方法失败返回错误1的解决方法

热门文章

  1. vb6.0 __stdcall函数内调用__cdecl函数_mingw版
  2. flutter中List遍历
  3. 程序员收到阿里offer,提离职被怒:为年薪百万连兄弟都不做啦!
  4. 19、硬盘和显卡的访问与控制
  5. JNA调用dll - java集成一美IP对讲SDK(dll文件)
  6. 除去英文句子中的数字、空格和标点符号
  7. 全部常用邮件端口25、109、110、143、465、995、993、994
  8. 【CISSP备考】第四章-通信与网络安全
  9. 在200元的电视盒子使用sealos玩转K8S
  10. AndriodStudio 开发环境下实现Xposed模块开发入门。Xposed框架模块编写教程