最近,公司项目集成了环信即时通讯,提出一个需求:分享app内文章资讯进环信群。先上个效果图(UI我随便放的,大家凑活看** — **):
先放上参考文章链接:https://www.jianshu.com/p/0692396f2fbe,在这里先感谢作者!在这篇文章里作者是通过在EaseChatExtendMenu 扩展,注册item的方式实现的发送名片功能,具体的大家可以看这篇文章。
我这里其实跟参考文章的原理是一样的,也是通过扩展消息的方式,自定义一个消息类型,通过发送text文本消息,自定义了消息UI,下面是实现步骤:
一、首先自定义扩展字段:
public class NewsConstant { public static final String newsExtType = "newsExtType";//资讯信息扩展 public static final String newsId = "newsId";//资讯信息ID public static final String newsTitle = "newsTitle";//资讯标题 public static final String newsDesc = "newsDesc";//资讯信息小文字描述 public static final String newsImgUrl = "newsImgUrl";//资讯图片 }
二、在ChatFragment中定义发送资讯消息和接收资讯消息的标识符,去CustomChatRowProvider内部类中设置接收和发送资讯消息:
1、在ChatFragment中定义发送资讯消息和接收资讯消息的标识符:
private static final int MESSAGE_TYPE_RECV_NEWS = 5; private static final int MESSAGE_TYPE_SEND_NEWS = 6;
2、去CustomChatRowProvider内部类中设置接收和发送资讯消息:
private final class CustomChatRowProvider implements EaseCustomChatRowProvider { @Override public int getCustomChatRowTypeCount() { //here the number is the message type in EMMessage::Type //which is used to count the number of different chat row return 13; } @Override public int getCustomChatRowType(EMMessage message) { if (message.getType() == EMMessage.Type.TXT) { //voice call if (message.getBooleanAttribute(Constant.MESSAGE_ATTR_IS_VOICE_CALL, false)) { return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_VOICE_CALL : MESSAGE_TYPE_SENT_VOICE_CALL; } else if (message.getBooleanAttribute(Constant.MESSAGE_ATTR_IS_VIDEO_CALL, false)) { //video call return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_VIDEO_CALL : MESSAGE_TYPE_SENT_VIDEO_CALL; } //messagee recall else if (message.getBooleanAttribute(Constant.MESSAGE_TYPE_RECALL, false)) { return MESSAGE_TYPE_RECALL; } else try { if ("1".equals(message.getStringAttribute(NewsConstant.newsExtType))) { return message.direct() == EMMessage.Direct.RECEIVE ? ChatFragment.MESSAGE_TYPE_RECV_NEWS : ChatFragment.MESSAGE_TYPE_SEND_NEWS; } } catch (HyphenateException e) { e.printStackTrace(); } } return 0; } @Override public EaseChatRowPresenter getCustomChatRow(EMMessage message, int position, BaseAdapter adapter) { if (message.getType() == EMMessage.Type.TXT) { if (message.getBooleanAttribute(Constant.MESSAGE_TYPE_RECALL, false)) { EaseChatRowPresenter presenter = new EaseChatRecallPresenter(); return presenter; } else try { if ("1".equals(message.getStringAttribute(NewsConstant.newsExtType))) { //发送资讯信息卡片 return new EaseChatNewsCallPresenter(); } } catch (HyphenateException e) { e.printStackTrace(); } } return null; } }
注意:在getCustomChatRowTypeCount()方法中,返回值记得加2,代表发送和接收资讯消息
如果想设置消息的点击事件,可以在onMessageBubbleClick()方法中实现:
@Override public boolean onMessageBubbleClick(EMMessage message) { try { //点击资讯消息事件 if ("1".equals(message.getStringAttribute(NewsConstant.newsExtType))) { Intent intent = new Intent(getActivity(), ArticleDetailsActivity.class); intent.putExtra("newsId", Integer.parseInt(message.getStringAttribute(NewsConstant.newsId))); startActivity(intent); return true; } } catch (HyphenateException e) { e.printStackTrace(); } return false; }
三、自定义EaseChatNewsCallPresenter:
public class EaseChatNewsCallPresenter extends EaseChatRowPresenter { @Override protected EaseChatRow onCreateChatRow(Context cxt, EMMessage message, int position, BaseAdapter adapter) { return new NewsChatRow(cxt, message, position, adapter); } }
四、非常重要!!!自定义NewsChatRow,也就是扩展消息的载体:
public class NewsChatRow extends EaseChatRow { private TextView title, desc; private ImageView img; public NewsChatRow(Context context, EMMessage message, int position, BaseAdapter adapter) { super(context, message, position, adapter); } /* 填充layout */ @Override protected void onInflateView() { inflater.inflate(message.direct() == EMMessage.Direct.RECEIVE ? R.layout.ease_row_received_news_call : R.layout.ease_row_send_news_call, this); } /* 查找chatrow中的控件 */ @Override protected void onFindViewById() { title = (TextView) findViewById(R.id.news_card_title); desc = (TextView) findViewById(R.id.news_card_desc); img = (ImageView) findViewById(R.id.news_card_img); } /* 消息状态改变,刷新listView */ @Override protected void onViewUpdate(EMMessage msg) { switch (msg.status()) { case CREATE: onMessageCreate(); break; case SUCCESS: onMessageSuccess(); break; case FAIL: onMessageError(); break; case INPROGRESS: onMessageInProgress(); break; } // adapter.notifyDataSetChanged(); } @Override protected void onSetUpView() { EMTextMessageBody textMessageBody = (EMTextMessageBody) message.getBody(); if (message.direct()== EMMessage.Direct.RECEIVE){ LogUtils.e(textMessageBody.getMessage()); } // message.getStringAttribute(NewsConstant.newsExtType, null); String titleStr = message.getStringAttribute(NewsConstant.newsTitle, null); String descStr = message.getStringAttribute(NewsConstant.newsDesc, null); String imgurlStr = message.getStringAttribute(NewsConstant.newsImgUrl, null); if (!TextUtils.isEmpty(titleStr)) title.setText(titleStr); if (!TextUtils.isEmpty(descStr)) desc.setText(descStr); Glide.with(context) .load(imgurlStr) .error(R.drawable.icon_logo) .placeholder(R.drawable.loading_img) .crossFade() .into(img); } private void onMessageCreate() { progressBar.setVisibility(View.VISIBLE); statusView.setVisibility(View.GONE); } private void onMessageSuccess() { progressBar.setVisibility(View.GONE); statusView.setVisibility(View.GONE); } private void onMessageError() { progressBar.setVisibility(View.GONE); statusView.setVisibility(View.VISIBLE); } private void onMessageInProgress() { progressBar.setVisibility(View.VISIBLE); statusView.setVisibility(View.GONE); } }
到这里用扩展消息实现发送资讯进群的功能基本就实现了,下面就是分享资讯消息进群了:
发送资讯消息事件:
EMMessage message = EMMessage.createTxtSendMessage("[分享]" + mainActivity.getData("newsTitle") , username); message.setAttribute(NewsConstant.newsExtType, "1");//设置扩展字段 message.setAttribute(NewsConstant.newsTitle, mainActivity.getData("newsTitle"));//将title设置到扩展字段 message.setAttribute(NewsConstant.newsImgUrl, mainActivity.getData("newsImg"));//将imgUrl设置到扩展字段 message.setAttribute(NewsConstant.newsId, mainActivity.getData("newsId"));//将newsId设置到扩展字段 message.setAttribute(NewsConstant.newsDesc, mainActivity.getData("newsDesc"));//将desc设置到扩展字段 Intent intent = new Intent(getActivity(), ChatActivity.class); if (conversation.isGroup()) { if (conversation.getType() == EMConversation.EMConversationType.ChatRoom) { // it's group chat message.setChatType(EMMessage.ChatType.ChatRoom); intent.putExtra(Constant.EXTRA_CHAT_TYPE, Constant.CHATTYPE_CHATROOM); } else { message.setChatType(EMMessage.ChatType.GroupChat);//注意:这行代码一定不要忘记,环信默认消息的类型是单聊,这行代码是改成群聊消息类型,否则会导致群聊消息接收不到 intent.putExtra(Constant.EXTRA_CHAT_TYPE, Constant.CHATTYPE_GROUP); } } // it's single chat intent.putExtra(Constant.EXTRA_USER_ID, username); EMClient.getInstance().chatManager().sendMessage(message); startActivity(intent);
注意:自定义扩展消息的字段名一定要跟IOS小伙伴的一致!!!
到这里扩展消息分享就完成了,有需要的童鞋可以看看