网易云信集成****(三):如何通过SDK实现自定义消息?
上期我们介绍了Android如何通过Uikit集成单聊模块,第三期****我们将教大家如何通过SDK实现自定义消息。
前期准备
- 从官网开发文档自定义消息流程(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)
- 参考BBS上如何通过SDK实现类似微信骰子的功能
(https://bbs.yunxin.163.com/forum.php?mod=viewthread&tid=23&highlight=%E9%AA%B0%E5%AD%90)
代码部分
大概思路是这样的
- 第一步,定义自定义消息的类型
public interface CustomAttachmentType{ int Guess=1;//猜拳 int Craps=2;//骰子 }
- 第二步,定义一个自定义消息附件的基类,负责解析你自定义消息的公用字段,比如类型等
注意: 实现 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(); }
- 第三步,继承基类,实现“骰子”附件类型
注意: 成员变量都要实现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; } }
- 第四步,实现自定义消息的附件解析器
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(); } }
- 第五步,将自定义消息展示在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()+"点!"; } }
- 第六步,发送自定义消息
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); } }
- 第七步,将附件解析器注册到SDK中,为保证生成历史消息时能够正确解析自定义附件,注册一般放在Applicaton的OnCreate中完成
- 第八步,注册扩展消息类型显示的ViewHolder,由于这里使用我们Uikit,所以也需要注册到Application的OnCreate里面
- 第九步,添加“骰子”的按钮到“+”中,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