您的位置:首页 > 其它

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

2017-01-17 14:52 555 查看
        折腾了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
4000
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());

运行代码即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐