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

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

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

发送文本消息及表情

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

EMConversation conversation = EMChatManagergetInstance()getConversation(username);

//创建一条文本消息

EMMessage message = EMMessagecreateSendMessage(EMMessageTypeTXT);

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

messagesetChatType(ChatTypeGroupChat);

//设置消息body

TextMessageBody txtBody = new TextMessageBody(content);

messageaddBody(txtBody);

//设置接收人

messagesetReceipt(username);

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

conversationaddMessage(message);

//发送消息

EMChatManagergetInstance()sendMessage(message, new EMCallBack(){});

发送语音消息

EMConversation conversation = EMChatManagergetInstance()getConversation(username);

EMMessage message = EMMessagecreateSendMessage(EMMessageTypeVOICE);

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

messagesetChatType(ChatTypeGroupChat);

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

messageaddBody(body);

messagesetReceipt(username);

conversationaddMessage(message);

EMChatManagergetInstance()sendMessage(message, new EMCallBack(){});

发送消息

EMConversation conversation = EMChatManagergetInstance()getConversation(username);

EMMessage message = EMMessagecreateSendMessage(EMMessageTypeIMAGE);

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

messagesetChatType(ChatTypeGroupChat);

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

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

// bodysetSendOriginalImage(true);

messageaddBody(body);

messagesetReceipt(username);

conversationaddMessage(message);

EMChatManagergetInstance()sendMessage(message, new EMCallBack(){});

发送地理位置消息

EMConversation conversation = EMChatManagergetInstance()getConversation(username);

EMMessage message = EMMessagecreateSendMessage(EMMessageTypeLOCATION);

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

messagesetChatType(ChatTypeGroupChat);

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

messageaddBody(locBody);

messagesetReceipt(username);

conversationaddMessage(message);

EMChatManagergetInstance()sendMessage(message, new EMCallBack(){});

发送文件消息

EMConversation conversation = EMChatManagergetInstance()getConversation(username);

// 创建一个文件消息

EMMessage message = EMMessagecreateSendMessage(EMMessageTypeFILE);

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

if (chatType == CHATTYPE_GROUP)

messagesetChatType(ChatTypeGroupChat);

//设置接收人的username

messagesetReceipt(username);

// add message body

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

messageaddBody(body);

conversationaddMessage(message);

EMChatManagergetInstance()sendMessage(message, new EMCallBack(){});

接收消息

通过广播接收新消息

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

EMChatgetInstance()setAppInited()

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

EMChatManagergetInstance()getChatOptions()setShowNotificationInBackgroud(false)

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

NewMessageBroadcastReceiver msgReceiver = new NewMessageBroadcastReceiver();

IntentFilter intentFilter = new IntentFilter(EMChatManagergetInstance()getNewMessageBroadcastAction());

intentFiltersetPriority(3);

registerReceiver(msgReceiver, intentFilter);

private class NewMessageBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

//消息id

String msgId = intentgetStringExtra("msgid");

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

String msgFrom = intentgetStringExtra("from");

//消息类型,文本、、语音消息等,这里返回的值为msgtypeordinal()。

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

int msgType = intentgetIntExtra("type", 0);

Logd("main", "new message id:" + msgId + " from:" + msgFrom + " type:" + msgType);

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

EMMessage message = EMChatManagergetInstance()getMessage(msgId);

}

}

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

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

EMNotifierEventEventEventDeliveryAck;//已发送回执event注册

EMNotifierEventEventEventNewCMDMessage;//接收透传event注册

EMNotifierEventEventEventNewMessage;//接收新消息event注册

EMNotifierEventEventEventOfflineMessage;//接收离线消息event注册

EMNotifierEventEventEventReadAck;//已读回执event注册

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

接收所有的 event 事件:

EMChatManagergetInstance()registerEventListener(new EMEventListener() {

@Override

public void onEvent(EMNotifierEvent event) {

// TODO Auto-generated method stub

EMMessage message = (EMMessage) eventgetData();

}

});

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

EMChatManagergetInstance()registerEventListener(new EMEventListener() {

@Override

public void onEvent(EMNotifierEvent event) {

// TODO Auto-generated method stub

EMMessage message = (EMMessage) eventgetData();

}

}, new EMNotifierEventEvent[]{EMNotifierEventEventEventNewMessage,}

);

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

解除监听事件

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

EMChatManagergetInstance()unregisterEventListener(new EMEventListener() {

@Override

public void onEvent(EMNotifierEvent event) {

// TODO Auto-generated method stub

}

});

获取聊天记录

EMConversation conversation = EMChatManagergetInstance()getConversation(username|groupid);

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

List<EMMessage> messages = conversationgetAllMessages();

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

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

List<EMMessage> messages = conversationloadMoreMsgFromDB(startMsgId, pagesize);

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

List<EMMessage> messages = conversationloadMoreGroupMsgFromDB(startMsgId, pagesize);

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

获取未读消息数量

EMConversation conversation = EMChatManagergetInstance()getConversation(username|groupid);

conversationgetUnreadMsgCount();

未读消息数清零

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

EMConversation conversation = EMChatManagergetInstance()getConversation(username|groupid);

conversationmarkAllMessagesAsRead();

所有未读消息数清零

EMChatManagergetInstance()markAllConversationsAsRead();

获取消息总数

EMConversation conversation = EMChatManagergetInstance()getConversation(username|groupid);

conversationgetMsgCount();

清空会话聊天记录

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

EMChatManagergetInstance()clearConversation(username|groupid);

删除单个聊天记录

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

EMChatManagergetInstance()deleteConversation(username|groupid);

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

EMConversation conversation = EMChatManagergetInstance()getConversation(username|groupid);

conversationremoveMessage(deleteMsgmsgId);

删除所有聊天记录

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

EMChatManagergetInstance()deleteAllConversation();

设置某条消息为已读

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

conversationgetMessage({msgid},markAsRead);

设置自定义的消息提示

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

//获取到配置options对象

EMChatOptions options = EMChatManagergetInstance()getChatOptions();

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

optionssetNotifyText(new OnMessageNotifyListener() {

@Override

public String onNewMessageNotify(EMMessage message) {

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

return "你的好基友" + messagegetFrom() + "发来了一条消息哦";

}

@Override

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

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

}

});

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

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

// 获取到EMChatOptions对象

EMChatOptions options = EMChatManagergetInstance()getChatOptions();

//设置notification点击listener

optionssetOnNotificationClickListener(new OnNotificationClickListener() {

@Override

public Intent onNotificationClick(EMMessage message) {

Intent intent = new Intent(applicationContext, ChatActivityclass);

ChatType chatType = messagegetChatType();

if(chatType == ChatTypeChat){ //单聊信息

intentputExtra("userId", messagegetFrom());

intentputExtra("chatType", ChatActivityCHATTYPE_SINGLE);

}else{ //群聊信息

//messagegetTo()为群聊id

intentputExtra("groupId", messagegetTo());

intentputExtra("chatType", ChatActivityCHATTYPE_GROUP);

}

return intent;

}

});

新消息提示

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

首先获取EMChatOptions。

chatOptions = EMChatManagergetInstance()getChatOptions();

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

chatOptionssetNotifyBySoundAndVibrate(true|false); //默认为true 开启新消息提醒

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

chatOptionssetNoticeBySound(true|false); //默认为true 开启声音提醒

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

chatOptionssetNoticedByVibrate(true|false); //默认为true 开启震动提醒

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

chatOptionssetUseSpeaker(true|false); //默认为true 开启扬声器播放

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

chatOptionssetShowNotificationInBackgroud(true|false) //默认为true

附:

chatOptionssetAcceptInvitationAlways(false);

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

1,根本就不应该用

GetMessage来获取队列消息,窗口的主线程

有个

GetMessage

循环来取消息了,你再来一个,有可能根本就取不到

WM_SETTEXT

这个消息,

2,既然

“aaa”

字符串的指针都得到了,并且这个指针就是在这个进程地址空间当中,所以用

lstrcpyn

这个函数来获取,

3,既然是获取消息,那么就该修改程序的窗口过程,指向自己的那个处理窗口的函数,来处理消息,

4,至于卡死,就是用了

GetMessage这个函数的问题,这个函数本身就是堵塞函数,消息队列中没有消息的时候就处于等待状态

以上就是关于集成过环信SDK后 是怎么接受消息,又是怎么把消息显示到界面上的全部的内容,包括:集成过环信SDK后 是怎么接受消息,又是怎么把消息显示到界面上的、请问VB如何用API: getmessage获取字符串、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9483792.html

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

发表评论

登录后才能评论

评论列表(0条)

保存