融云IM接收系统消息出现,会话页面显示”此版本暂不支持该类型消息“的解决方案


        折腾了3天,问了客服人员,看了几遍Demo,终于解决了这个问题(网上有许多其他的解决方法都不行,那得看你的融云sdk是什么版本的,我这个是最新版本的解决方案,可以参考着看)

       其实思路都是一致的,融云的代码里也是这样写的,Demo里的RongIM.java里可以看得到有很多消息模板,点击进去看看,用点心去理解一下就明白了。

       思路如下:建议配合融云官方文档来看,这样比较好懂,链接:http://www.rongcloud.cn/docs/android.html#消息自定义

       1.提供消息类型(融云支持自定义消息类型,只是消息类型的标识不要和融云内部一样就好),可以使用自定义消息类型,也可以           使用融云提供的消息类型,代码写法都是一致的,参考官方文档的--------》”新建消息

       2.提供消息模板,参考官方文档的--------》”消息展示“,其中UI可以自定义,改一下要添加进来的布局即可

       3.注册消息类型和消息模板(在融云初始化后注册即可)


代码如下:

1.消息类型:

package cn.lizhangqu.kb.IMforApp;

import android.os.Parcel;
import android.util.Log;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.UnsupportedEncodingException;

import io.rong.common.ParcelUtils;
import io.rong.common.RLog;
import io.rong.imlib.MessageTag;
import io.rong.imlib.model.MessageContent;

/**
 * Created by xuweijie on 2017/1/16.
 */
@MessageTag(
        value = "RC:ContactNtf",
        flag = MessageTag.ISCOUNTED | MessageTag.ISPERSISTED
)
public class CustomizeMessage extends MessageContent {
    private String operation;//操作名
    private String sourceUserId;//发送者id
    private String targetUserId;//目标id
    private String message;//添加/拒绝的理由
    private String extra;//附加信息

    /**
     * 读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。
     */
    public static final Creator<CustomizeMessage> CREATOR = new Creator<CustomizeMessage>() {

        @Override
        public CustomizeMessage createFromParcel(Parcel source) {
            return new CustomizeMessage(source);
        }

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


    //实现 encode() 方法,该方法的功能是将消息属性封装成 json 串
    // ,再将 json 串转成 byte 数组,该方法会在发消息时调用
    @Override
    public byte[] encode() {
        JSONObject jsonObj = new JSONObject();
        try {
            jsonObj.putOpt("operation",this.getOperation());
            jsonObj.putOpt("sourceUserId", this.getSourceUserId());
            jsonObj.putOpt("targetUserId",this.getTargetUserId());
            jsonObj.putOpt("message",this.getMessage());
            jsonObj.putOpt("extra",this.getExtra());
        } catch (JSONException e) {
            Log.e("JSONException", e.getMessage());
        }
        try {
            return jsonObj.toString().getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return null;
    }



    /**
     * 覆盖父类的 MessageContent(byte[] data) 构造方法,该方法将对收到的消息进行解析,
     * 先由 byte 转成 json 字符串,再将 json 中内容取出赋值给消息属性。
     */
    public CustomizeMessage(byte[] data) {
        String jsonStr = null;

        try {
            jsonStr = new String(data, "UTF-8");
        } catch (UnsupportedEncodingException e1) {

        }

        try {
            JSONObject jsonObj = new JSONObject(jsonStr);

            if (jsonObj.has("operation"))
                this.setOperation(jsonObj.optString("operation"));
            if(jsonObj.has("sourceUserId"))
                this.setSourceUserId(jsonObj.optString("sourceUserId"));
            if(jsonObj.has("targetUserId"))
                this.setTargetUserId(jsonObj.optString("targetUserId"));
            if(jsonObj.has("message"))
                this.setMessage(jsonObj.optString("message"));
            if(jsonObj.has("extra"))
                this.setExtra(jsonObj.optString("extra"));
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }


    //给消息赋值。
    public CustomizeMessage(Parcel in) {
        this.setOperation(ParcelUtils.readFromParcel(in));
        this.setSourceUserId(ParcelUtils.readFromParcel(in));
        this.setTargetUserId(ParcelUtils.readFromParcel(in));
        this.setMessage(ParcelUtils.readFromParcel(in));
        this.setExtra(ParcelUtils.readFromParcel(in));
    }


    /**
     * 描述了包含在 Parcelable 对象排列信息中的特殊对象的类型。
     *
     * @return 一个标志位,表明Parcelable对象特殊对象类型集合的排列。
     */
    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 将类的数据写入外部提供的 Parcel 中。
     *
     * @param parcel  对象被写入的 Parcel。
     * @param flags 对象如何被写入的附加标志。
     */
    @Override
    public void writeToParcel(Parcel parcel, int i) {
        ParcelUtils.writeToParcel(parcel,this.getOperation());
        ParcelUtils.writeToParcel(parcel,this.getSourceUserId());
        ParcelUtils.writeToParcel(parcel,this.getTargetUserId());
        ParcelUtils.writeToParcel(parcel,this.getMessage());
        ParcelUtils.writeToParcel(parcel,this.getExtra());
    }

    public String getOperation() {
        return operation;
    }

    public void setOperation(String operation) {
        this.operation = operation;
    }

    public String getSourceUserId() {
        return sourceUserId;
    }

    public void setSourceUserId(String sourceUserId) {
        this.sourceUserId = sourceUserId;
    }

    public String getTargetUserId() {
        return targetUserId;
    }

    public void setTargetUserId(String targetUserId) {
        this.targetUserId = targetUserId;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getExtra() {
        return extra;
    }

    public void setExtra(String extra) {
        this.extra = extra;
    }
}

2.消息模板

package cn.lizhangqu.kb.IMforApp;

import android.content.Context;
import android.graphics.Color;
import android.text.Spannable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import cn.lizhangqu.kb.R;
import io.rong.imkit.model.ProviderTag;
import io.rong.imkit.model.UIMessage;
import io.rong.imkit.widget.provider.IContainerItemProvider;
import io.rong.imlib.model.MessageContent;

/**
 * Created by xuweijie on 2017/1/16.
 */
@ProviderTag(messageContent = CustomizeMessage.class)

public class CustomizeMessageItemProvider extends
        IContainerItemProvider.MessageProvider<CustomizeMessage>{

    class ViewHolder {
        TextView message,comstate;
        Button btconfirm,btrefult;
    }

    @Override
    public View newView(Context context, ViewGroup viewGroup) {
        View view = LayoutInflater.from(context).
                inflate(R.layout.rc_imsystemaddfriend, null);
        ViewHolder holder = new ViewHolder();
        holder.message = (TextView) view.findViewById(R.id.id_sys_title);
        holder.btconfirm= (Button) view.findViewById(R.id.id_bt_confirm);
        holder.btrefult= (Button) view.findViewById(R.id.id_bt_refult);
        holder.comstate= (TextView) view.findViewById(R.id.id_com_state);
        view.setTag(holder);
        return view;
    }

    @Override
    public void bindView(View view, int i, CustomizeMessage customizeMessage, UIMessage uiMessage) {
        final ViewHolder holder= (ViewHolder) view.getTag();
        holder.message.setText(customizeMessage.getMessage());
        holder.btconfirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                holder.btconfirm.setVisibility(View.GONE);
                holder.btrefult.setVisibility(View.GONE);
                holder.comstate.setVisibility(View.VISIBLE);
            }
        });
        holder.btrefult.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                holder.btconfirm.setVisibility(View.GONE);
                holder.btrefult.setVisibility(View.GONE);
                holder.comstate.setVisibility(View.VISIBLE);
                holder.comstate.setText("已拒绝");
                holder.comstate.setTextColor(Color.RED);
            }
        });
    }

    @Override
    public Spannable getContentSummary(CustomizeMessage customizeMessage) {
        return null;
    }

    @Override
    public void onItemClick(View view, int i, CustomizeMessage customizeMessage, UIMessage uiMessage) {
    }

    @Override
    public void onItemLongClick(View view, int i, CustomizeMessage customizeMessage, UIMessage uiMessage) {

    }

}


3.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_marginTop="10dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp">

        <TextView
            android:id="@+id/id_sys_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:text="对方请求添加您为好友!"
            />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="right"
        >

        <Button
            android:id="@+id/id_bt_confirm"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:background="@drawable/button_accept_bg"
            android:text="确定"
            android:textColor="@color/white"
            android:layout_marginLeft="10dp"
            />

        <Button
            android:id="@+id/id_bt_refult"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:textColor="@color/white"
            android:background="@drawable/button_reflect_bg"
            android:text="拒绝"/>

        <TextView
            android:id="@+id/id_com_state"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:textColor="@color/bargreen"
            android:visibility="gone"
            android:text="已确认"/>

    </LinearLayout>
</LinearLayout>

4.注册消息类型和消息模板

RongIM.init(this);
RongIM.registerMessageType(CustomizeMessage.class);
RongIM.getInstance().registerMessageTemplate(new CustomizeMessageItemProvider());


运行代码即可


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值