折腾了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 CREATOR = new Creator() {
@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;
}
}
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{
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.布局文件
RongIM.init(this);
RongIM.registerMessageType(CustomizeMessage.class);
RongIM.getInstance().registerMessageTemplate(new CustomizeMessageItemProvider());