expert-app/uikit/documents/自定义消息.md
2025-11-18 15:25:59 +08:00

192 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 自定义消息
以掷骰子为例
首先,先定义一个自定义消息的类型
```java
public interface CustomAttachmentType {
// 多端统一
int Guess = 1;
int SnapChat = 2;
int Sticker = 3;
int RTS = 4;
int Crops=5;//骰子
}
```
第二步,定义一个自定义消息附件的基类,负责解析你的自定义消息的公用字段,比如类型等 。
> 注意: 实现 MsgAttachment 接口的成员都要实现 Serializable。
```java
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。
```java
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.Guess);
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;
}
}
```
第四步,实现自定义消息的附件解析器。
```java
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.Crops:
attachment = new CrapsAttachment();
default:
attachment = new DefaultCustomAttachment();
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上当然这里显示的文字如果想要显示成图片可以参考demo
```java
public class MsgViewHolderCrops extends MsgViewHolderText{
@Override
protected String getDisplayText() {
//实例化一个attachment
CrapsAttachment attachment = (CrapsAttachment)message.getAttachment();
return attachment.getValue().getDesc() + "点!";
}
}
```
第六步,发送自定义消息
```java
public class CrapsAction extends BaseAction{
public CrapsAction(){
super(R.drawable.message_plus_crops_selector, R.string.input_panel_crops);
}
@Override
public void onClick() {
CrapsAttachment attachment = new CrapsAttachment();
IMMessage message = MessageBuilder.createCustomMessage(
getAccount(), getSessionType(), attachment.getValue().getDesc(), attachment
);
sendMessage(message);
}
}
```
第七步,将该附件解析器注册到 SDK 中。为了保证生成历史消息时能够正确解析自定义附件,注册一般应放在 Application 的 onCreate 中完成
```java
NIMClient.getService(MsgService.class).registerCustomAttachmentParser(new CustomAttachParser());
```
第八步注册扩展消息类型的显示ViewHolder由于这里使用我们UIKIT所以也需要注册到Application的onCreate中
```java
NimUIKit.registerMsgItemViewHolder(CrapsAttachment.class, MsgViewHolderCrops.class);
```
第九步,添加“骰子”的按钮到“+”号中Demo是在SessionHelper.java里面定制的单聊界面。
```java
ArrayList<BaseAction> actions = new ArrayList<>();
actions.add(new CrapsAction());
```