环信扩展消息:App内分享资讯进群

最近,公司项目集成了环信即时通讯,提出一个需求:分享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小伙伴的一致!!!

到这里扩展消息分享就完成了,有需要的童鞋可以看看

你可能感兴趣的:(环信扩展消息:App内分享资讯进群)