wildfirechat / android-chat

即时通讯,聊天,野火IMAndroid客户端,支持Android 4.x —— 最新
http://docs.wildfirechat.cn
Other
2.54k stars 889 forks source link

自定义消息怎么接收服务端添加的消息问题 #695

Closed jueduiyheng closed 2 years ago

jueduiyheng commented 2 years ago

比如我发送了一张优惠券,但是后端会添加一些不可再消息界面看见的数据,那么我在TicketMessageContent里要怎么接口数据呢.

imndx commented 2 years ago
  1. 请参考 #655
  2. 消息里面有个extra字段,可以放一些附加数据
jueduiyheng commented 2 years ago
  1. 请参考android端Im如何自定义消息 #655
  2. 在里面的extra字段中,可以放一些附加信息

出了新的问题,现在自定义消息发出去了,聊天框里也能显示这消息但是点击这消息,RedPackerMessageContent却是空的,没有后端发来的任何信息

imndx commented 2 years ago

请检查你的自定义消息的decode方法

jueduiyheng commented 2 years ago

请检查你的自定义消息的decode方法

public class RedPackerMessageContent extends MessageContent { private String displayName; private String portrait; private String slogan; private String redPacket;

public RedPackerMessageContent() {
}

public RedPackerMessageContent(String displayName, String portrait, String slogan) {
    this.displayName = displayName;
    this.portrait = portrait;
    this.slogan = slogan;
}

public String getDisplayName() {
    return displayName;
}

public void setDisplayName(String displayName) {
    this.displayName = displayName;
}

public String getPortrait() {
    return portrait;
}

public void setPortrait(String portrait) {
    this.portrait = portrait;
}

public String getSlogan() {
    return slogan;
}

public void setSlogan(String slogan) {
    this.slogan = slogan;
}

public String getRedPacket() {
    return redPacket;
}

public void setRedPacket(String redPacket) {
    this.redPacket = redPacket;
}

@Override
public MessagePayload encode() {
    MessagePayload payload = super.encode();
    payload.content = redPacket;
    try {
        JSONObject objWrite = new JSONObject();
        objWrite.put("d", displayName);
        objWrite.put("p", portrait);
        objWrite.put("s", slogan);

        payload.binaryContent = objWrite.toString().getBytes();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return payload;
}

@Override
public void decode(MessagePayload payload) {
    redPacket = payload.content;
    try {
        if (payload.binaryContent != null) {
            JSONObject jsonObject = new JSONObject(new String(payload.binaryContent));
            displayName = jsonObject.optString("d");
            portrait = jsonObject.optString("p");
            slogan = jsonObject.optString("s");
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

@Override
public String digest(Message message) {

    return "[红包]:" + displayName;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    super.writeToParcel(dest, flags);
    dest.writeString(this.displayName != null ? this.displayName : "");
    dest.writeString(this.portrait != null ? this.portrait : "");
    dest.writeString(this.slogan != null ? this.slogan : "");
}

protected RedPackerMessageContent(Parcel in) {
    super(in);
    this.displayName = in.readString();
    this.portrait = in.readString();
    this.slogan = in.readString();
}

public static final Creator<RedPackerMessageContent> CREATOR = new Creator<RedPackerMessageContent>() {
    @Override
    public RedPackerMessageContent createFromParcel(Parcel source) {
        return new RedPackerMessageContent(source);
    }

    @Override
    public RedPackerMessageContent[] newArray(int size) {
        return new RedPackerMessageContent[size];
    }
};

payload.content 这里就是后端返回来的数据

jueduiyheng commented 2 years ago

打断点 MessageContent 没有返回后端的任何数据

imndx commented 2 years ago
  1. 后端发的消息格式,要和encode生成的MessagePayload格式一样
  2. 请在marsservice进程decode的地方打断点,或者加日志,看看这个地方收到的MessagePayload对不对
jueduiyheng commented 2 years ago

可以了,就是decode里面的问题