Android-网易云信(IM)-自定义消息

首先,贴上官方文档地址:

http://dev.netease.im/docs/product/IM%E5%8D%B3%E6%97%B6%E9%80%9A%E8%AE%AF/SDK%E5%BC%80%E5%8F%91%E9%9B%86%E6%88%90/Android%E5%BC%80%E5%8F%91%E9%9B%86%E6%88%90/%E6%B6%88%E6%81%AF%E6%94%B6%E5%8F%91?#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%B6%88%E6%81%AF

API 介绍 
除了内建消息类型以外,SDK 还支持收发自定义消息类型。SDK 不负责定义和解析自定义消息的具体内容,解释工作由开发者完成。SDK 会将自定义消息存入消息数据库,会和内建消息一并展现在消息记录中。

为了使用更加方便,自定义消息采用附件的方式展示给开发者。体现在 IMMessage 类中,自定义消息的内容会被解析为 MsgAttachment 对象,由于 SDK 并不知道自定义消息的格式,第三方 App 需要注册一个自定义消息解析器。当第三方 App 调用查询查询消息历史的接口,或者是 SDK 收到消息通知第三方 App 时,就能将自定义消息内容转换为一个 MsgAttachment 对象,然后就可以同操作图片消息等带附件消息一样,操作自定义消息了。

与 IMMessage 一致,为了增加自定义消息的灵活性,SDK 还提供了对其生命周期和推送参数的一些配置选项,开发者可以自主设定一条自定义消息是否要保存云端消息记录,是否要漫游,发送时是否要多端同步等的配置选项 CustomMessageConfig。

下面说说具体做法:

1.定义CustomAttachmentType

public interface CustomAttachmentType {
    // 多端统一
    int Guess = 1;
    int SnapChat = 2;
    int Sticker = 3;
    int RTS = 4;
    int RedPacket = 5;
    int OpenedRedPacket = 6;
    int MyOrderCustomMsg = 10002;

//这里需要注意。需要与后台设置统一。后台设置的时候。不是100的那个自定义消息类型,而是消息body中的type
}

2.定义CustomAttachParser

这里写图片描述

3.定义MyOrderAttachment

package com.netease.nim.demo.session.extension;

import android.util.Log;
import com.alibaba.fastjson.JSONObject;

public class MyOrderAttachment extends CustomAttachment{

    public String title;
    public String content;

    public MyOrderAttachment() {
        super(CustomAttachmentType.MyOrderCustomMsg);
    }

    @Override
    protected void parseData(JSONObject data) {

//        Log.d("flag","MyOrderAttachment==="+data.toString());
        title=data.getString("title");
        content=data.getString("content");
    }

    @Override
    protected JSONObject packData() {
        JSONObject data = new JSONObject();

        data.put("title",title);
        data.put("content",content);

        return data;
    }
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

}

4.定义MsgViewHolderMyOrder

package com.netease.nim.demo.session.viewholder;

import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.iliexiang.dianjing.R;
import com.iliexiang.dianjing.dialog.RobOrderDialog;
import com.iliexiang.dianjing.ui.order.public_order.PublicOrderDetailActivity;
import com.iliexiang.dianjing.ui.order.rob.RobCenterActivity;
import com.iliexiang.dianjing.utils.StringUtil;
import com.iliexiang.dianjing.utils.ToastUtils;
import com.netease.nim.demo.session.SessionHelper;
import com.netease.nim.demo.session.extension.MyOrderAttachment;
import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase;
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter;


public class MsgViewHolderMyOrder extends MsgViewHolderBase {

    private MyOrderAttachment attachment;
    private TextView tv_order_title;
    private TextView tv_order_content;
    private LinearLayout ll_msg_order;

    public MsgViewHolderMyOrder(BaseMultiItemFetchLoadAdapter adapter) {
        super(adapter);
    }

    @Override
    protected int getContentResId() {
        //自己定义的布局
        return R.layout.im_msg_order;
    }

    @Override
    protected void inflateContentView() {
        ll_msg_order = findViewById(R.id.ll_msg_order);
        tv_order_title = findViewById(R.id.tv_order_title);
        tv_order_content = findViewById(R.id.tv_order_content);
    }

    @Override
    protected void bindContentView() {

        attachment = (MyOrderAttachment) message.getAttachment();
        tv_order_title.setText(attachment.getTitle());

        if (StringUtil.isNull(attachment.getContent())) {
            tv_order_content.setVisibility(View.GONE);
        } else {
            tv_order_content.setVisibility(View.VISIBLE);
            tv_order_content.setText(attachment.getContent());
        }

        ll_msg_order.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //点击事件


            }
        });

    }

    //若是要自己修改气泡背景
    // 当是发送出去的消息时,内容区域背景的drawable id
    // @Override
    protected int rightBackground() {
        return R.drawable.shape_border_gray3_r5;
    }

    @Override
    protected int leftBackground() {
        return R.drawable.shape_border_gray3_r5;
    }
}

5.在SessionHelper,注册

这里写图片描述

大功告成

猜你喜欢

转载自blog.csdn.net/androidsj/article/details/80497474