You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
5.3 KiB
192 lines
5.3 KiB
2 years ago
|
# 自定义消息
|
||
|
|
||
|
以掷骰子为例
|
||
|
|
||
|
首先,先定义一个自定义消息的类型
|
||
|
|
||
|
```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());
|
||
|
```
|