融雲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());


運行代碼即可


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章