折騰了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());