集成过环信SDK后 是怎么接受消息,又是怎么把消息显示到界面上的

集成过环信SDK后 是怎么接受消息,又是怎么把消息显示到界面上的,第1张

可以发送文本消息和表情、语音消息、图片消息、地理位置消息以及文件消息。

发送文本消息及表情

//获取到与聊天人的会话对象。参数username为聊天人的userid或者groupid,后文中的username皆是如此

EMConversation conversation = EMChatManager.getInstance().getConversation(username)

//创建一条文本消息

EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT)

//如果是群聊,设置chattype,默认是单聊

message.setChatType(ChatType.GroupChat)

//设置消息body

TextMessageBody txtBody = new TextMessageBody(content)

message.addBody(txtBody)

//设置接收人

message.setReceipt(username)

//把消息加入到此会话对象中

conversation.addMessage(message)

//发送消息

EMChatManager.getInstance().sendMessage(message, new EMCallBack(){})

发送语音消息

EMConversation conversation = EMChatManager.getInstance().getConversation(username)

EMMessage message = EMMessage.createSendMessage(EMMessage.Type.VOICE)

//如果是群聊,设置chattype,默认是单聊

message.setChatType(ChatType.GroupChat)

VoiceMessageBody body = new VoiceMessageBody(new File(filePath), len)

message.addBody(body)

message.setReceipt(username)

conversation.addMessage(message)

EMChatManager.getInstance().sendMessage(message, new EMCallBack(){})

发送图片消息

EMConversation conversation = EMChatManager.getInstance().getConversation(username)

EMMessage message = EMMessage.createSendMessage(EMMessage.Type.IMAGE)

//如果是群聊,设置chattype,默认是单聊

message.setChatType(ChatType.GroupChat)

ImageMessageBody body = new ImageMessageBody(new File(filePath))

// 默认超过100k的图片会压缩后发给对方,可以设置成发送原图

// body.setSendOriginalImage(true)

message.addBody(body)

message.setReceipt(username)

conversation.addMessage(message)

EMChatManager.getInstance().sendMessage(message, new EMCallBack(){})

发送地理位置消息

EMConversation conversation = EMChatManager.getInstance().getConversation(username)

EMMessage message = EMMessage.createSendMessage(EMMessage.Type.LOCATION)

//如果是群聊,设置chattype,默认是单聊

message.setChatType(ChatType.GroupChat)

LocationMessageBody locBody = new LocationMessageBody(locationAddress, latitude, longitude)

message.addBody(locBody)

message.setReceipt(username)

conversation.addMessage(message)

EMChatManager.getInstance().sendMessage(message, new EMCallBack(){})

发送文件消息

EMConversation conversation = EMChatManager.getInstance().getConversation(username)

// 创建一个文件消息

EMMessage message = EMMessage.createSendMessage(EMMessage.Type.FILE)

// 如果是群聊,设置chattype,默认是单聊

if (chatType == CHATTYPE_GROUP)

message.setChatType(ChatType.GroupChat)

//设置接收人的username

message.setReceipt(username)

// add message body

NormalFileMessageBody body = new NormalFileMessageBody(new File(filePath))

message.addBody(body)

conversation.addMessage(message)

EMChatManager.getInstance().sendMessage(message, new EMCallBack(){})

接收消息

通过广播接收新消息

注意事项:为了防止新消息来时,因为没有注册广播接收者,导致漏接消息的情况,注册完接受者以及好友监听等事件后,需要调用以下 SDK 才会发送新消息的广播,只需调用一次即可,可参考 Demo 的 mainactivity。

EMChat.getInstance().setAppInited()

另外,当 APP 在后台时,SDK 默认以 notification 的形式通知有新消息,不会走广播,如果需要走广播,可以调用以下 SDK 关闭 notification 通知,这样新消息还是走发送广播的形式。

EMChatManager.getInstance().getChatOptions().setShowNotificationInBackgroud(false)

注册一个相应 broadcast,用来接收消息。

NewMessageBroadcastReceiver msgReceiver = new NewMessageBroadcastReceiver()

IntentFilter intentFilter = new IntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction())

intentFilter.setPriority(3)

registerReceiver(msgReceiver, intentFilter)

private class NewMessageBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

//消息id

String msgId = intent.getStringExtra("msgid")

//发消息的人的username(userid)

String msgFrom = intent.getStringExtra("from")

//消息类型,文本、图片、语音消息等,这里返回的值为msg.type.ordinal()。

//所以消息type实际为是enum类型

int msgType = intent.getIntExtra("type", 0)

Log.d("main", "new message id:" + msgId + " from:" + msgFrom + " type:" + msgType)

//更方便的方法是通过msgId直接获取整个message

EMMessage message = EMChatManager.getInstance().getMessage(msgId)

}

}

通过监听事件来接收新消息

注意事项:注册消息事件监听,此 listener 会收到所有类型的 event 事件,如果对某种或某些类型的事件感兴趣,可以用 registerEventListener(EMEventListener listener, EMNotifierEvent.EventType[] types)。

EMNotifierEvent.Event.EventDeliveryAck//已发送回执event注册

EMNotifierEvent.Event.EventNewCMDMessage//接收透传event注册

EMNotifierEvent.Event.EventNewMessage//接收新消息event注册

EMNotifierEvent.Event.EventOfflineMessage//接收离线消息event注册

EMNotifierEvent.Event.EventReadAck//已读回执event注册

EMNotifierEvent.Event.EventConversationListChanged//通知会话列表通知event注册(在某些特殊情况,SDK去删除会话的时候会收到回调监听)

接收所有的 event 事件:

EMChatManager.getInstance().registerEventListener(new EMEventListener() {

@Override

public void onEvent(EMNotifierEvent event) {

// TODO Auto-generated method stub

EMMessage message = (EMMessage) event.getData()

}

})

有选择性的接收某些类型 event 事件:

EMChatManager.getInstance().registerEventListener(new EMEventListener() {

@Override

public void onEvent(EMNotifierEvent event) {

// TODO Auto-generated method stub

EMMessage message = (EMMessage) event.getData()

}

}, new EMNotifierEvent.Event[]{EMNotifierEvent.Event.EventNewMessage,.......}

)

注:广播和监听事件不可同时混用。

解除监听事件

如果不想收到回调,则执行解除监听事件。

EMChatManager.getInstance().unregisterEventListener(new EMEventListener() {

@Override

public void onEvent(EMNotifierEvent event) {

// TODO Auto-generated method stub

}

})

获取聊天记录

EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid)

//获取此会话的所有消息

List<EMMessage>messages = conversation.getAllMessages()

//sdk初始化加载的聊天记录为20条,到顶时需要去db里获取更多

//获取startMsgId之前的pagesize条消息,此方法获取的messages sdk会自动存入到此会话中,app中无需再次把获取到的messages添加到会话中

List<EMMessage>messages = conversation.loadMoreMsgFromDB(startMsgId, pagesize)

//如果是群聊,调用下面此方法

List<EMMessage>messages = conversation.loadMoreGroupMsgFromDB(startMsgId, pagesize)

消息管理(单一聊天人、所有聊天人)

获取未读消息数量

EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid)

conversation.getUnreadMsgCount()

未读消息数清零

指定会话消息未读数清零。

EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid)

conversation.markAllMessagesAsRead()

所有未读消息数清零

EMChatManager.getInstance().markAllConversationsAsRead()

获取消息总数

EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid)

conversation.getMsgCount()

清空会话聊天记录

//清空和某个user的聊天记录(包括本地),不删除conversation这个会话对象

EMChatManager.getInstance().clearConversation(username|groupid)

删除单个聊天记录

//删除和某个user的整个的聊天记录(包括本地)

EMChatManager.getInstance().deleteConversation(username|groupid)

//删除当前会话的某条聊天记录

EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid)

conversation.removeMessage(deleteMsg.msgId)

删除所有聊天记录

//删除所有会话记录(包括本地)

EMChatManager.getInstance().deleteAllConversation()

设置某条消息为已读

//markAsRead为true,则标记msgid的消息位已读

conversation.getMessage({msgid},markAsRead)

设置自定义的消息提示

APP 在后台时,新消息会通过 notification 的方式,在手机状态栏提示新消息,可以把提示的内容换成自定义的内容(在application的oncreate()里设置)。

//获取到配置options对象

EMChatOptions options = EMChatManager.getInstance().getChatOptions()

//设置自定义的文字提示

options.setNotifyText(new OnMessageNotifyListener() {

@Override

public String onNewMessageNotify(EMMessage message) {

//可以根据message的类型提示不同文字,这里为一个简单的示例

return "你的好基友" + message.getFrom() + "发来了一条消息哦"

}

@Override

public String onLatestMessageNotify(EMMessage message, int fromUsersNum, int messageNum) {

return fromUsersNum + "个基友,发来了" + messageNum + "条消息"

}

})

设置自定义 notification 点击跳转 intent。

用户点击 notification 消息,SDK 会有默认的跳转 intent,开发者可以设置自己的跳转 intent,这里以 UIdemo 的代码为例。

// 获取到EMChatOptions对象

EMChatOptions options = EMChatManager.getInstance().getChatOptions()

//设置notification点击listener

options.setOnNotificationClickListener(new OnNotificationClickListener() {

@Override

public Intent onNotificationClick(EMMessage message) {

Intent intent = new Intent(applicationContext, ChatActivity.class)

ChatType chatType = message.getChatType()

if(chatType == ChatType.Chat){ //单聊信息

intent.putExtra("userId", message.getFrom())

intent.putExtra("chatType", ChatActivity.CHATTYPE_SINGLE)

}else{ //群聊信息

//message.getTo()为群聊id

intent.putExtra("groupId", message.getTo())

intent.putExtra("chatType", ChatActivity.CHATTYPE_GROUP)

}

return intent

}

})

新消息提示

SDK 中提供了方便的新消息提醒功能。可以在收到消息时调用,提醒用户有新消息。

首先获取EMChatOptions。

chatOptions = EMChatManager.getInstance().getChatOptions()

设置是否启用新消息提醒(打开或者关闭消息声音和震动提示)。

chatOptions.setNotifyBySoundAndVibrate(true|false)//默认为true 开启新消息提醒

设置是否启用新消息声音提醒。

chatOptions.setNoticeBySound(true|false)//默认为true 开启声音提醒

设置是否启用新消息震动提醒。

chatOptions.setNoticedByVibrate(true|false)//默认为true 开启震动提醒

设置语音消息播放是否设置为扬声器播放。

chatOptions.setUseSpeaker(true|false)//默认为true 开启扬声器播放

设置后台接收新消息时是否通过通知栏提示。

chatOptions.setShowNotificationInBackgroud(true|false) //默认为true

附:

chatOptions.setAcceptInvitationAlways(false)

//默认添加好友时为true,是不需要验证的,改成需要验证为false

找恒星啊,我就是找他们的,其他人都是扯淡

专业团队ɋɋ:146-606-79

希望能帮到你,

,

,

,

,

应用程序管理器-滑动屏幕选项(全部)-找到信息-点击进入,清除数据试下。

2、设定-应用程序管理器-滑动屏幕选项(全部)-BadgeProvider点击进入清除数据试下

3、若问题依旧存在(第三方软件引起)。

请备份手机数据(电话薄、短信息、多媒体资料等),将手机恢复出厂设置尝试(设定-重置-恢复出厂设定)。

注:存储在手机中的数据全部丢失,一定要提前备份到sim卡和sd卡中再 *** 作。

若问题仍然存在,请将手机送至就近的服务中心进行检测。

进入C:\Windows\system32,在下面寻找计算器程序calc.exe。如果能找到,右键发送到桌面快捷方式,把快捷方式改名为计算器,然后拖动到C:

\Users(用户)\用户名\AppData\Roaming\Microsoft\Windows\「开始」菜单\程序\附件 文件夹下面。如果找不到,从网上下载一个Win7的

calc.exe,放到C:\Windows\system32下,然后再按上述步骤 *** 作。

@是重量单位和容积单位后来又成了工程用语然后又成了DOS命令,如常用语句"@echo off"再之一开始是a-tail的缩写,表示长尾巴的a,后来

大众普遍当做是表示英文单词"at",后来这种用法逐渐减少了,可是又多了两种用法:1.邮箱用户名与域名之间的间隔符理应用"at"却用"@"代

替2.表示单价,比如"Sell@1 pound"表示以1英镑的单价出售,这两种用法使用频率之高难以想象。"@"根据"at"的读音读"艾尔特"或"艾特",另

外,由于网络用语越来越时髦,"@"又被"爆炒"出了3种用法:1.@时代即网络时代2.@是很酷的一个表情,表示开心、高兴等3.@族即14-29岁的人

const int aint const a这两个写法是等同的,表示a是一个int常量。

const int *a表示a是一个指针,可以任意指向int常量或者int变量,它总是把它所指向的目标当作一个int常量。也可以写成int const* a含

义相同。

int * const a表示a是一个指针常量,初始化的时候必须固定指向一个int变量,之后就不能再指向别的地方了。

int const * a const这个写法没有,倒是可以写成int const * const a表示a是一个指针常量

constintfun(){}表示函数不能为左值。必须用一个变量来接收他得返回例如:inta=constintfun()//正确constintfun()//直接调用会报错

intfun()const{}这个表示类中的const成员也能调用这个函数。

excel自定义函数(而不是函数)调用excel的自带函数时,在函数前加上这个引用就可以了。即:Application.WorksheetFunction.+函数名 excel

函数: Excel是办公室自动化中非常重要的一款软件。Excel中所提的函数其实是一些预定义的公式

如果是e.getSource()是获取发起事件的控件对象。 e.getSource()==button1用来判断发起事件的控件是不是button1。

按性质分:

(1)实义动词(及物动词,不及物动词,联系动词)

(2)助动词

(3)情态动

按时限分类:

(1)延续性动词

(2)非延续性动词

按功能分:

(1)谓语动词

(2)不定式

(3)动名词

(4)现在分词

(5)过去分词

系动词,感官动词,还有使役动词是包括在以上类别中的特殊动词1.系动词包括BE动词和由行为动词转化来的如:look,seem

,appear,smell,taste,become,grow很多.要在实际学习中不断掌握2.感官动词:是指看,听,闻,尝等与感官有关的动词,其中有些也可做系动词.3.

使役动词:have,make,let等,只可翻译成使某人做某事,让某人做某事的词动词是英语中最重要的词,也是最难的,分类并不重要,要在具体情况中明

白动词的用法,时态和语态.

注册透传消息广播如下:

// 透传广播

IntentFilter cmdIntentFilter = new IntentFilter(EMChatManager.getInstance().getCmdMessageBroadcastAction())

CMDBroadcastReceiver cmdMessageReceiver = new CMDBroadcastReceiver()

appContext.registerReceiver(cmdMessageReceiver, cmdIntentFilter)

发送透传消息如下:

EMMessage cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD)// 透传消息

//支持单聊和群聊,默认单聊,如果是群聊添加下面这行

// cmdMsg.setChatType(ChatType.GroupChat)

//action可以自定义,在广播接收时可以收到

CmdMessageBody cmdBody = new CmdMessageBody(action)

cmdMsg.addBody(cmdBody)

// 给自己的好友发送通知

if (IMHelper.getInstance().getImUserList() != null &&IMHelper.getInstance().getImUserList().size() >0) {

for(IMUser imUser:IMHelper.getInstance().getImUserList()){

if(!imUser.getUid().equals(curUsername)){// 不给自己发送这条消息

cmdMsg.setReceipt(imUser.getUid())// 接收这条通知的人id

cmdMsg.setAttribute("ToUsername",curUsername)// 需要修改当前用户的头像id

cmdMsg.setAttribute(key,obj)//支持自定义扩展

sendCMDMessage(cmdMsg)

}

}

}

private static void sendCMDMessage(EMMessage cmdMsg){

EMChatManager.getInstance().sendMessage(cmdMsg,new EMCallBack() {

@Override

public void onSuccess() {

// 发送成功

}

@Override

public void onProgress(int arg0, String arg1) {

// 发送进度

}

@Override

public void onError(int arg0, String arg1) {

// 发送失败

}

})

}

接收透传的广播如下:

public class CMDBroadcastReceiver extends BroadcastReceiver{

@Override

public void onReceive(Context context, Intent intent) {

Log.d("ME", "进入到广播啦")

if(intent!=null){

//获取cmd message对象

String msgId = intent.getStringExtra("msgid")

EMMessage message = intent.getParcelableExtra("message")

//获取消息body

CmdMessageBody cmdMsgBody = (CmdMessageBody) message.getBody()

String aciton = cmdMsgBody.action//获取自定义action

if(IMConstants.ACTION_UPDATE_USER_AVATAR.equals(aciton)){// 更新头像指令

updateAvatar(message)

}else if(IMConstants.ACTION_UPDATE_USER_NICK.equals(aciton)){// 更新昵称

updateNick(message)

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7930617.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存