网易云信集成视频教程(三):如何通过SDK实现自定义消息?

上期我们介绍了Android如何通过Uikit集成单聊模块,第三期视频教程我们将教大家如何通过SDK实现自定义消息。

前期准备

  1. 从官网开发文档自定义消息流程(https://dev.yunxin.163.com/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
  2. 参考BBS上如何通过SDK实现类似微信骰子的功能

https://bbs.yunxin.163.com/forum.php?mod=viewthread&tid=23&highlight=%E9%AA%B0%E5%AD%90

 

 

代码部分

大概思路是这样的

  1. 第一步,定义自定义消息的类型
public interface CustomAttachmentType{



    int Guess=1;//猜拳



    int Craps=2;//骰子



}

 

  1. 第二步,定义一个自定义消息附件的基类,负责解析你自定义消息的公用字段,比如类型等

注意: 实现 MsgAttachment 接口的成员都要实现 Serializable。

public abstract class CustomAttachment implements MsgAttachment {



    protected int type;

    CustomAttachment(int type) {

        this.type = type;

    }

    public void fromJson(JSONObject data) {

        if (data != null) {

            parseData(data);

        }

    }

    @Override

    public String toJson(boolean send) {

        return CustomAttachParser.packData(type, packData());

    }

    public int getType() {

        return type;

    }

    protected abstract void parseData(JSONObject data);

    protected abstract JSONObject packData();

}

 

  1. 第三步,继承基类,实现“骰子”附件类型

注意: 成员变量都要实现Serializable。

public class CrapsAttachment extends CustomAttachment{



    public enum Craps {

        one(1, "1"),

        two(2, "2"),

        three(3, "3"),

        four(4, "4"),

        five(5, "5"),

        six(6, "6"),

        ;



        private int value;

        private String desc;



        Craps(int value, String desc) {

            this.value = value;

            this.desc = desc;

        }



        static Craps enumOfValue(int value) {

            for (Craps direction : values()) {

                if (direction.getValue() == value) {

                    return direction;

                }

            }

            return one;

        }



        public int getValue() {

            return value;

        }



        public String getDesc() {

            return desc;

        }

    }



    private Craps value;



    public CrapsAttachment() {

        super(CustomAttachmentType.Craps);

        random();

    }



    @Override

    protected void parseData(JSONObject data) {

        value = Craps.enumOfValue(data.getIntValue("value"));

    }



    @Override

    protected JSONObject packData() {

        JSONObject data = new JSONObject();

        data.put("value", value.getValue());

        return data;

    }



    private void random() {

        int value = new Random().nextInt(6) + 1;

        this.value = Craps.enumOfValue(value);

    }



    public Craps getValue() {

        return value;

    }

}

 

  1. 第四步,实现自定义消息的附件解析器
public class CustomAttachParser implements MsgAttachmentParser {

    private static final String KEY_TYPE = "type";

    private static final String KEY_DATA = "data";



    @Override

    public MsgAttachment parse(String json) {

        CustomAttachment attachment = null;

        try {

            JSONObject object = JSON.parseObject(json);

            int type = object.getInteger(KEY_TYPE);

            JSONObject data = object.getJSONObject(KEY_DATA);

            switch (type) {

                case CustomAttachmentType.Guess:

                    attachment = new GuessAttachment();

                    break;

                case CustomAttachmentType.Craps:

                    attachment = new CrapsAttachment();

                    break;

            }



            if (attachment != null) {

                attachment.fromJson(data);

            }

        } catch (Exception e) {



        }



        return attachment;

    }



    public static String packData(int type, JSONObject data) {

        JSONObject object = new JSONObject();

        object.put(KEY_TYPE, type);

        if (data != null) {

            object.put(KEY_DATA, data);

        }



        return object.toJSONString();

    }

}

 

  1. 第五步,将自定义消息展示在UI上(这里简单以文字展示)
public class MsgViewHolderCraps extends MsgViewHolderText{



    public MsgViewHolderCraps(BaseMultiItemFetchLoadAdapter adapter) {

        super(adapter);

    }



    @Override

    protected String getDisplayText() {

        CrapsAttachment crapsAttachment = (CrapsAttachment) message.getAttachment();

        return crapsAttachment.getValue().getDesc()+"点!";

    }

}

 

  1. 第六步,发送自定义消息
public class CrapsAction extends BaseAction {



    public CrapsAction(){

        super(R.drawable.message_plus_guess_selector, R.string.input_craps);

    }

    @Override

    public void onClick() {

        CrapsAttachment attachment = new CrapsAttachment();

        IMMessage message = MessageBuilder.createCustomMessage(

                getAccount(), getSessionType(), attachment.getValue().getDesc(), attachment

        );

        sendMessage(message);

    }

}

 

  1. 第七步,将附件解析器注册到SDK中,为保证生成历史消息时能够正确解析自定义附件,注册一般放在Applicaton的OnCreate中完成
  2. 第八步,注册扩展消息类型显示的ViewHolder,由于这里使用我们Uikit,所以也需要注册到Application的OnCreate里面
  3. 第九步,添加“骰子”的按钮到“+”中,Demo是在SessionHelper类中定制的单聊界面

注:第七八九三步可以直接一起做,在Application中初始化SessionHelper,然后在SessionHelper中注册解析器以及UI

public class MyApplication extends Application {



    @Override

    public void onCreate() {

        super.onCreate();

        // SDK初始化(启动后台服务,若已经存在用户登录信息, SDK 将完成自动登录)

        NIMClient.init(this, null, null);

        if(NIMUtil.isMainProcess(this)){

            //初始化UIKIT

            NimUIKit.init(this);

            SessionHelper.init();

        }

    }

}

 

public class SessionHelper  {



    private static SessionCustomization p2pCustomization;



    public static void init(){

        //解析器

        NIMClient.getService(MsgService.class).registerCustomAttachmentParser(new CustomAttachParser());

        //猜拳的UI

        NimUIKit.registerMsgItemViewHolder(GuessAttachment.class, MsgViewHolderGuess.class);

        //骰子的ui

        NimUIKit.registerMsgItemViewHolder(CrapsAttachment.class, MsgViewHolderCraps.class);

        NimUIKit.setCommonP2PSessionCustomization(getP2pCustomization());

    }



    // 定制化单聊界面。如果使用默认界面,返回null即可

    private static SessionCustomization getP2pCustomization() {

        if(p2pCustomization == null){

            p2pCustomization = new SessionCustomization();



            // 定制加号点开后可以包含的操作, 默认已经有图片,视频等消息了

            ArrayList<BaseAction> actions = new ArrayList<>();

            actions.add(new GuessAction());

            actions.add(new CrapsAction());

            p2pCustomization.actions = actions;

        }

        return p2pCustomization;

    }

}

这里就完美实现了Android自定义消息,赶紧去试试吧~

想看更多集成视频教程,请戳https://netease.im/videoTutorial

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值