Android-IM使用imui组件结合JMessage实现即时消息对话
来源:互联网 发布:计算机资格考试软件 编辑:程序博客网 时间:2024/05/16 10:51
项目源码请参考 Android-IM
项目服务端使用极光JMessage
对话列表使用aurora-imui开源组件
简介
imui
是极光在GitHub上开源的一个即时通讯库,方便开发者快速使用,完成即时通讯类的对话展示。目前支持Android、iOS、React Native三大平台。
该库在Android端包括两大控件
- MessageList
- ChatInputView
1.MessageList
展示的对话列表,支持自定义ViewHolder布局
导入方式:
compile 'cn.jiguang.imui:messagelist:0.4.6'
2.ChatInputView
消息输入方式,比如语音,图片,位置等
导入方式:
compile 'cn.jiguang.imui:chatinput:0.4.6'
JMessage
是极光提供的sdk服务,用于接收和转发消息。也是项目中最重要的部分。
集成方式建议直接参考文档,已经很详细了:JMessage Android SDK 集成指南
开始前的准备
1.在布局中加入控件
关于一些常用的属性,比如发送方或者接收方的字体大小颜色等,可以手动设置。
<cn.jiguang.imui.messages.MessageList android:id="@+id/msg_list" android:layout_width="match_parent" android:layout_height="match_parent" app:avatarHeight="48dp" app:avatarWidth="48dp" app:bubbleMaxWidth="0.70" app:dateTextSize="14sp" app:receiveBubblePaddingLeft="16dp" app:receiveBubblePaddingRight="8dp" app:receiveTextColor="#ffffff" app:receiveTextSize="14sp" app:sendBubblePaddingLeft="8dp" app:sendBubblePaddingRight="16dp" app:sendTextColor="#7587A8" app:sendTextSize="14sp" />
2.创建消息实体MyMessage
展示和解析消息的类,必须要实现IMessage接口。
因为这里需要解析极光服务端的消息,所以需要添加一个内部Message的解析。
public class MyMessage implements IMessage { private long id; private String text; private String timeString; private MessageType type; private IUser user; private String mediaFilePath; private long duration; private String progress; private Message message; private int position; private long msgID; public MyMessage(String text, MessageType type) { this.text = text; this.type = type; this.id = UUID.randomUUID().getLeastSignificantBits(); }......//省略get、set方法}
3.实现IUser接口
用户头像,id,用户名等参数
public class DefaultUser implements IUser { private String id; private String displayName; private String avatar; public DefaultUser(String id, String displayName, String avatar) { this.id = id; this.displayName = displayName; this.avatar = avatar; }
创建消息
这里的创建消息并不是单单指消息的发送,包括消息的接收,展示等都需要手动去创建消息,以便于展示。
其实消息列表就是由多个MyMessage得到的。
1.创建展示的消息
创建消息需要两个参数,一个是要展示的消息类型:
另一个参数是设置发送方或者接收方的位置和类型
MyMessage myMessage = new MyMessage(((TextContent) message.getContent()).getText(), IMessage.MessageType.RECEIVE_TEXT);
由于不同的类型需要不同的解析,所以如果类型出错就会崩溃。
2.创建展示的对话用户信息
setUserInfo需要一个IUser的参数类型。
DefaultUser需要的参数分别是当前登录的用户名、显示的名称、头像
myMessage.setUserInfo(new DefaultUser(JMessageClient.getMyInfo().getUserName(), "DeadPool", imgRecrive));
发送消息
注意要区分Message和MyMessage:
Message是用来上传,发送消息的,是sdk指定的唯一消息类型。
而MyMessage是UI指定的消息类,所以两者之间需要经常转换。
private void sendMessage(String msg) { //创建文本消息 TextContent content = new TextContent(msg); //获取创建的消息 Message message1 = conversation.createSendMessage(content); //创建展示的本地消息 final MyMessage myMessage = new MyMessage(msg, SEND_TEXT); myMessage.setMessage(message1); myMessage.setTimeString(TimeUtils.ms2date("MM-dd HH:mm", message1.getCreateTime())); myMessage.setUserInfo(new DefaultUser(JMessageClient.getMyInfo().getUserName(), "DeadPool", imgSend)); //返回的结果 message1.setOnSendCompleteCallback(new BasicCallback() { @Override public void gotResult(int i, String s) { if (i == 0) { //将消息添加到本地视图 mAdapter.addToStart(myMessage, true); mChatEt.setText(""); } else { } } }); //向服务器发送消息 JMessageClient.sendMessage(message1);
adapter不需要手动创建只需在开始的时候调用:
username:当前用户名
holder:自定义的viewholder,为空则使用默认的布局
iamge:当前的用户头像(发送方)
MsgListAdapter adapter = new MsgListAdapter<>(userName, holdersConfig, imageLoader);messageList.setAdapter(adapter);
接收消息
onEvent是固定的写法,参数有几种类型
MessageEvent只负责接收消息事件。
比如消息撤回事件就是MessageRetractEvent。
但是都需要先通过Message解析消息,然后再使用MyMessage解析到本地,用于UI的展示
/*接收到的消息*/ public void onEvent(MessageEvent event) { final Message message = event.getMessage(); runOnUiThread(new Runnable() { @Override public void run() { //创建一个消息对象 MyMessage myMessage = new MyMessage(((TextContent) message.getContent()).getText(), IMessage.MessageType.RECEIVE_TEXT); myMessage.setMessage(message); myMessage.setMsgID(message.getServerMessageId()); myMessage.setText(((TextContent) message.getContent()).getText() + ""); myMessage.setTimeString(TimeUtils.ms2date("MM-dd HH:mm", message.getCreateTime())); myMessage.setUserInfo(new DefaultUser(JMessageClient.getMyInfo().getUserName(), "DeadPool", imgRecrive)); if (message.getContentType() == ContentType.text || message.getContentType().equals("text")) { mAdapter.addToStart(myMessage, true); mAdapter.notifyDataSetChanged(); } //收到消息时,添加到集合 list.add(myMessage); } }); }
其它消息事件:
比如全局监听重复登录事件,需要在根Activity处理。
监听事件
1.点击头像的监听
setOnAvatarClickListener是封装在Messagelist控件里的方法,可以直接拿来用。
一般分为两种,发送方的头像和接收方的头像
在执行相应跳转的时候要进行消息方的判断。
//点击头像 mAdapter.setOnAvatarClickListener(new MsgListAdapter.OnAvatarClickListener<MyMessage>() { @Override public void onAvatarClick(MyMessage message) { DefaultUser userInfo = (DefaultUser) message.getFromUser(); Intent intent; if (message.getType() == SEND_TEXT) { intent = new Intent(mContext, UserActivty.class); } else { intent = new Intent(mContext, UserInfoActivity.class); intent.putExtra("USERNAME", userName); } Log.e("userName", userInfo + "\n" + userName); startActivity(intent); } });
2.单击消息
单击消息事件,可以选择查看大图或者播放视频,播放语音文件等操作
mAdapter.setOnMsgClickListener(new MsgListAdapter.OnMsgClickListener<MyMessage>() { @Override public void onMessageClick(MyMessage message) { // do something showToast(ChatMsgActivity.this, "点击了消息"); } });
3.长按消息
一般长按消息,会选择一些复制、删除、撤回等功能。
复制:在复制的时候要先判断消息类型,如果不是TEXT类型是无法复制的。
删除:删除需要提交消息id到服务端,并且移除本地视图,更新UI。两行代码就可以完成操作。
conversation.deleteMessage(new Integer(message.getMsgId())); //移除视图 mAdapter.deleteById(message.getMsgId());
撤回:跟删除类似,不过删除只是本地看不到,撤回需要接收撤回事件,防止消息撤回还能看到,详细操作请参考Android-IM即时通讯关于消息撤回的处理
//长按消息 mAdapter.setMsgLongClickListener(new MsgListAdapter.OnMsgLongClickListener<MyMessage>() { @Override public void onMessageLongClick(final MyMessage message) {}
完整代码还请参考项目
项目地址:https://github.com/wapchief/Android-IM
相关文章推荐
- Android-IM从零开始开发一个即时通讯项目
- Android-IM即时通讯关于消息撤回的处理
- Android-IM给即时通讯添加一个自动聊天机器人
- Android-IM使用极光即时通讯发送、接收好友请求
- Android-IM使用imui组件结合JMessage实现即时消息对话
- 使用websocket 实现即时消息
- Android IM、IOS IM、XMPP协议、即时消息推送解决方案
- RFC3428 IM(即时消息)
- android JMessage集成
- XMPP学习3-IM即时消息
- Android端使用asmack实现IM
- android使用fir.im实现版本更新
- 如何实现android的即时消息投递
- JMessage Android 端开发详解
- JMessage Android 端开发详解
- Android 使用ViewPager结合PhotoView开源组件实现网络图片在线浏览功能
- openfire+android实现IM
- Android机器人对话实现
- 即时消息机制实现方法
- asp即时消息的实现
- Android发送即时消息
- android即时消息处理机制
- Ajax全接触(2)
- PAT 1038. Recover the Smallest Number的思考
- 12:与指定数字相同的数的个数
- java使用cookie实现下次自动登录
- Java web学习总结20: JavaBean总结
- Android-IM使用imui组件结合JMessage实现即时消息对话
- 真实的程序员的日常
- 全国省市区数据库sql
- 1002.写出这个数(字符串处理)
- 慕课七夕主题动画效果
- Project facet Java version 1.7 not supported错误
- leetcode 669. Trim a Binary Search Tree
- linux设备驱动开发详情
- Javaweb项目导出成jar包并使用Windows定时任务定时执行