一步一步给你的Androidapp加入聊天功能.docx
- 文档编号:28112710
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:15
- 大小:20.94KB
一步一步给你的Androidapp加入聊天功能.docx
《一步一步给你的Androidapp加入聊天功能.docx》由会员分享,可在线阅读,更多相关《一步一步给你的Androidapp加入聊天功能.docx(15页珍藏版)》请在冰豆网上搜索。
一步一步给你的Androidapp加入聊天功能
步一步给你的Androidapp加入聊天功能
简介
自去年LeanCloud发布实时通信(IM)服务之后,基于用户反馈和工程师对需求的消化和对业务的提炼,上周正式发布了「实时通信2.0」。
设计理念依然是「灵活、解耦、可组合、可定制」,具体可以参考《实时通信开发指南》,了解LeanCloud实时通信的基本概念和模型。
下载和安装
可以到LeanCloud官方下载点下载LeanCloudIMSDKv2版本。
将下载到的jar包加入工程即可。
Demo及示例代码如果您觉得一点点阅读文档较慢,可以直接看我们的「Demo代码」,并且下载自己运行一下试试看。
一对一的文本聊天我们先从最简单的环节入手,看看怎么用LeanCloudIMSDK实现一对一文本聊天。
初始化
和LeanCloud其他服务一样,实时聊天服务的初始化也是
在Application的onCreate方法中进行的:
publicclassMyApplicationextendsApplication{
publicvoidonCreate(){
AVOSCloud.initialize(this,"{{appId}}","{{appKey}}");
}
}
并且在AndroidManifest.xml中间声明:
接下来我们开始一步一步接入聊天服务登录
用户在开始聊天之前,需要先登录LeanCloud云端。
这个登录并不需要用户名、密码认证,只是与LeanCloud云端建立一个长连接,所以只需要传入一个可唯一标识当前用户的clientId即可。
在本SDK中,我们会为每一个终端用户开启一个
AVIMClient实例,获取这一实例的方法位于com.avos.avoscloud.im.v2.AVIMClient类中,其声明如下:
publicstaticAVIMClientgetInstance(StringclientId)
SDK内部会为每一个clientId创建唯一的AVIMClient实例,同一个clientId多次调用该方法,得到的都是同一个结果。
所以如果要支持同一个客户端内多账号登录,只要使用不同的clientId多次调用该方法即可。
LeanCloudIMSDK本身是支持多账户同时登录的。
得到AVIMClient实例之后,我们需要登录LeanCloud云端。
这是通过调用AVIMClient的open方法实现的,其声明如下:
publicvoidopen(finalAVIMClientCallbackcallback)
open函数返回的时候,会把AVIMClient实例和
AVException信息(如果发生错误的话)传给AVIMClientCallback回调接口。
好了,我们现在来实际看一下这个过程如何实现。
假定聊天发起方名叫Tom,为直观起见,我们使用用户名来作为clientId登录聊天系统(LeanCloud云端只要求clientId在应用内唯一即可,具体用什么数据由应用层决定),代码如下:
AVIMClientimClient=AVIMClient.getInstance("Tom");imClient.open(newIMClientCallback(){
@Override
publicvoiddone(AVIMClientclient,AVExceptione){
if(null!
=e){
//出错了,可能是网络问题无法连接LeanCloud云端,请检查网络之后重试。
//此时聊天服务不可用。
e.printStackTrace();
}else{
//成功登录,可以开始进行聊天了(假设为
MainActivity)。
Intentintent=newIntent(currentActivity,
MainActivity.class);
currentActivity.startActivity(intent);
};
}
});
建立对话
在本版本IMSDK中,开始聊天之前,需要先创建或者加入一个「对话」(AVIMConversation),所有消息都是由某个client发往一个「对话」,「对话」内的所有成员会实时收到新消息。
对话支持如下默认属性:
conversationId,字符串,对话id,只读,对话创建之后由LeanCloud云端赋予一个全局唯一的id。
creator,字符串,对话创建者的clientId,只读,标识对话创建者信息
members,数组,对话参与者,这里记录了所有的参与者name,字符串,对话的名字,可选,可用来对于群组命名attributes,Map/Dict,自定义属性,可选,供开发者自己扩展用。
transient,布尔值,表示对话是否为暂态对话(关于暂态对话,后面会详细解释)
我们可以通过AVIMClient来创建一个对话,其函数声明为:
//指定成员、自定义属性,创建对话publicvoidcreateConversation(finalListconversationMembers,finalMapattributes,finalAVIMConversationCreatedCallbackcallback);
//指定成员、名字、自定义属性,创建对话
publicvoidcreateConversation(finalListconversationMembers,Stringname,finalMapattributes,finalAVIMConversationCreatedCallbackcallback);
//指定成员、名字、自定义属性和对话标志,创建对话publicvoidcreateConversation(finalListconversationMembers,Stringname,finalMapattributes,finalbooleanisTransient,final
AVIMConversationCreatedCallbackcallback);
各参数的含义如下:
conversationMembers-对话初始成员列表,可以为空
name-对话的名字,可选
isTransient-是否为暂态对话标志,默认为falsecallback-结果回调接口,在创建结束之后调用,通知开发者成功与否
接下来我们看看实际如何创建一个对话。
假定我们要跟「Bob」这个用户进行聊天,我们先创建一个对话,代码如下:
ListclientIds=newArrayList();
clientIds.add("Tom");
clientIds.add("Bob");
//我们给对话增加一个自定义属性type,表示单聊还是群聊
//常量定义:
//intConversationType_OneOne=0;//两个人之间的单聊
//intConversationType_Group=1;//多人之间的群聊
Mapattr=newHashMap();
attr.put("type",ConversationType_OneOne);
imClient.createConversation(clientIds,attr,newAVIMConversationCreatedCallback(){
@Override
publicvoiddone(AVIMConversationconversation,
AVExceptione){
if(null!
=conversation){
//成功了,这时候可以显示对话的Activity页面(假定为ChatActivity)了。
Intentintent=newIntent(this,ChatActivity.class);
Intent.putExtra(“conversation”,conversation);
startActivity(intent);
}
}});
建立的「对话」在控制台怎么查看
如你所见,我们创建一个对话的时候,指定了成员(Tom和Bob)和一个额外的属性({type:
0})。
这些数据保存到云端后,你在控制台->存储->数据里面会看到,_Conversation表中增加了一条记录,新记录的m属性值为["Tom","Bob"],attr属性值为{"type":
。
}。
如你所料,m属性就是对应着成员列表,attr属性就是用户增加的额外属性值(以对象的形式存储)。
发送消息通过AVIMConversation的sendMessage族方法,可以将消息发往目标对话。
方法声明如下:
//直接发送一条消息,在大多数情况下,你该调用这个方法publicvoidsendMessage(AVIMMessagemessage,finalAVIMConversationCallbackcallback);
//发送消息时,指定特殊的消息选项,用来发送特别的消息publicvoidsendMessage(finalAVIMMessagemessage,finalintmessageFlag,finalAVIMConversationCallbackcallback);
各参数的含义如下:
message-消息实例
messageFlag-消息选项(普通消息,暂态消息,待回执消息),可选,默认值是普通消息
callback-结果回调接口,在发送结束之后调用,通知开发者成功与否
接下来我们试着发送一条普通文本消息。
示例代码如下:
AVIMMessagemessage=newAVIMMessage();message.setContent("hello");
conversation.sendMessage(message,new
AVIMConversationCallback(){
@Override
publicvoiddone(AVExceptione){
if(null!
=e){
//出错了。
。
。
e.printStackTrace();
}else{
Logger.d("发送成功,msgId="+message.getMessageId());
}
}
});
好了,这样一条消息就发送过去了。
但是问题来了,对于「Bob」而言,他怎么才能收到别人发给他的消息呢?
消息接收
在Bob这一端,要能接收到消息,需要如下几步:
1,进行初始化;
2,准备好自己的AVIMMessageHandler,响应新消息到达通知。
在本版本IMSDK中,我们设计的框架是将消息类型与具体的handler类绑定起来,这样开发者可以为不同类型的消息设置不同的handler,处理起来更加灵活自由。
这一绑定过程是通过
com.avos.avoscloud.im.v2.AVIMMessageManager类的voidregisterMessageHandler(Classclazz,
MessageHandlerhandler)函数实现的。
AVIMMessageManager类中还有一个方法voidregisterDefaultMessageHandler(AVIMMessageHandlerhandler)则用来指定全局默认的消息处理handler。
AVIMMessageHandler的主要函数如下:
publicvoidonMessage(AVIMMessagemessage,AVIMConversationconversation,AVIMClientclient);对于Tom发过来的消息,要接收并显示出来,我们只需实现onMessage方法即可,示例代码如下:
classCustomMessageHandlerextends
AVIMMessageHandler{
@Override
publicvoidonMessage(AVIMMessagemessage,AVIMConversationconversation,AVIMClientclient){
//新消息到来了。
在这里增加你自己的处理代码。
StringmsgContent=message.getContent();
Logger.d(conversation.getConversationid()+"收到一条新消息:
"+msgContent);
}
}
3,进行登录,代码也与发送端一样。
Bob这边要接收到Tom发过来的消息,其完整流程如下:
//自定义消息响应类
classCustomMessageHandlerextends
AVIMMessageHandler{
@Override
publicvoidonMessage(AVIMMessagemessage,
AVIMConversationconversation,AVIMClientclient){
//新消息到来了。
在这里增加你自己的处理代码。
StringmsgContent=message.getContent();
Logger.d(conversation.getConversationid()+"收到一条新消息:
"+msgContent);
}
}
//application的初始化部分publicvoidonCreate(){
AVOSCloud.initialize(this,"{{appId}}","{{appKey}}");
AVIMMessageManager.registerDefaultMessageHandler(newCustomMessageHandler());
}
//用户登录部分
AVIMClientimClient=AVIMClient.getInstance("Bob");imClient.open(newIMClientCallback(){
@Override
publicvoiddone(AVIMClientclient,AVExceptione){
if(null!
=e){
//出错了,可能是网络问题无法连接LeanCloud端,请检查网络之后重试。
//此时聊天服务不可用。
e.printStackTrace();
}else{
//成功登录,可以开始进行聊天了。
};
}
});注意!
AVIMMessageManager.registerDefaultMessageHandler()一定要在AVIMClient.open()之前调用,否则可能导致服务器发回来的部分消息丢失。
退出登录
在app退出的时候,或者切换用户的时候,我们需要断开与LeanCloud实时通信服务的长连接,这时候需要调用AVIMClient.close(finalAVIMClientCallbackcallback)函数。
一般情况下,这个函数都会关闭连接并立刻返回,这时候Leancloud实时通信服务端就会认为当前用户已经下线。
几个主要的回调接口从上面的例子中可以看到,要接收到别人给你发送的消息,需要重载AVIMMessageHandler类。
从v2版开始,LeanCloudIMSDK大量采用回调来反馈操作结果,但是对于一些被动的消息通知,则还是采用接口来实现的,包括:
当前网络出现变化对话中有新的消息对话中有新成员加入对话中有成员离开被邀请加入某对话被踢出对话
LeanCloudIMSDK内部使用了三种接口来响应这些事件。
网络事件响应接口主要用来处理网络变化事件,接口定义在
AVIMClientEventHandler,主要函数为:
voidonConnectionPaused(AVIMClientclient)指网络连接
断开事件发生,此时聊天服务不可用。
voidonConnectionResume(AVIMClientclient)指网络连接
恢复正常,此时聊天服务变得可用。
在网络中断的情况下,所有的消息收发和对话操作都会出现问题。
通过
AVIMClient.setClientEventHandler(AVIMClientEventHandl
erhandler)可以设定全局的ClientEventHandler。
对话成员变化响应接口主要用来处理对话中成员变化的事件,接口定义在
AVIMConversationEventHandler,主要函数为:
onMemberLeft(AVIMClientclient,AVIMConversation
conversation,Listmembers,StringkickedBy)对话中有成
员离开时所有剩余成员都会收到这一通知。
参数意义说明如下:
client指已经登录的client,因为支持一个客户端多账户登录,每个账户会对应一个clientconversation指目标对话;members指离开的成员列表;kickedBy表示踢人者的id;onMemberJoined(AVIMClientclient,AVIMConversationconversation,Listmembers,StringinvitedBy)对话中有新成员加入时所有成员都会收到这一通知。
参数意义说明如下:
client指已经登录的client,因为支持一个客户端多账户登录,每个账户会对应一个clientconversation指目标对话;members指加入的新成员列表;invitedBy表示邀请者的idonKicked(AVIMClientclient,AVIMConversationconversation,StringkickedBy)当前用
户被踢出对话的通知,参数意义说明如下:
client指已经登录的client,因为支持一个客户端多账户登录,每个账户会对应一个clientconversation指目标对话;
kickedBy表示踢人者的idonInvited(AVIMClientclient,
AVIMConversationconversation,Stringoperator)当前用户被邀请加入对话的通知。
参数意义说明如下:
client指已经登录的client,因为支持一个客户端多账户登录,每个账户会对应一个clientconversation指目标对话;operator表示邀请者的id通过AVIMMessageManager.setConversationEventHandler(AVIMConversationEventHandlerhandler)可以设置全局的ConversationEventHandler。
消息响应接口主要用来处理新消息到达事件,接口定义在MessageHandler,AVIMMessageHandler是一个空的实现类,我们应该通过重载AVIMMessageHandler的相关方法来完成消息处理。
主要的方法有:
onMessage(AVIMMessagemessage,AVIMConversationconversation,AVIMClientclient)指接收到新的消息。
参数意义说明如下:
client指已经登录的client,因为支持一个客户端多账户登录,每个账户会对应一个clientconversation指目标对话;
自己
message表示消息实例onMessageReceipt(AVIMMessagemessage,AVIMConversationconversation,AVIMClientclient)发送的消息被对方接收时会收到此通知,各参数意义同上。
通过AVIMMessageManager.registerDefaultMessageHandler(handler)可以设置全局的MessageHandler。
我们实现这三类接口,就可以处理所有的通知消息了。
示例代码如下:
//处理网络状态变化事件
classCustomNetworkHandlerextends
AVIMClientEventHandler{
@Override
publicvoidonConnectionPaused(AVIMClientclient){
//请按自己需求改写
Logger.d("connectpaused");
}
@Override
publicvoidonConnectionResume(AVIMClientclient){
Logger.d("connectresume");
}
}
//处理对话成员变化事件
classCustomConversationHandlerextends
AVIMConversationEventHandler{
publicprivateContextgContext=null;
privatevoidtoast(Stringstr){
Toast.makeText(gContext,str,
Toast.LENGTH_SHORT).show();
}
privatevoidtoast(Contextcontext,Stringstr){
Toast.makeText(context,str,
Toast.LENGTH_SHORT).show();
}
@Override
publicvoidonMemberLeft(AVIMClientclient,AVIMConversationconversation,Listmembers,StringkickedBy){
用来
用来
toast(MsgUtils.nameByUserIds(members)+"left,
kickedby"+MsgUtils.nameByUserId(kickedBy));
//注:
MsgUtils是一个辅助类,nameByUserIds将userId转换成用户名
}
@Override
publicvoidonMemberJoined(AVIMClientclient,AVIMConversationco
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一步一步 给你 Androidapp 加入 聊天 功能