融云系列之自定义消息

每次当自己要写文章的时候就觉得,怎么上一次写文章都过去了这么久,真是服了自己了,本着后来者少走弯路的原则,再加上融云的文档写的那叫一个简明(zhen)扼(la)要(ji).记录下这个。

融云的集成我这里就不赘述了,直接照着官网就OK了,唯一注意的就是你申请的APP_KEY 别忘记在IMLib 在其androidManifest中配置下。

融云自定义消息的实现大致分为以下几个步骤

1.新建一个实体类继承 MessageContent 重写里面  encode  同时 覆盖MessageContent 的 MessageContent(byte[] data)

encode 是将这个自定义的消息封装成json串后再转成字节数组,

MessageContent(byte[] data) 是将刚才的字节数组再转成json 然后获取你构造的实体类的值。由于MessageContent本身实现了Parcel所以我们也需要实现Parcelable 中的方法。(注意实体类的顺序不能乱

2.添加该类的注解 value是自己定义消息模板标识,注意不要和融云自己的混淆了同时如果你们的项目之间存在和iOS平台的互通一定要保持value值的一致,后面的flag 总共有三种类型

MessageTag.NONE 没有任何意思,主要就是该类型的消息不会显示在会话界面和会话列表

MessageTag.ISOUNTED 就是统计消息未读数量的,一般都需要加上

MessageTag.ISPERSISTED 客户端收到消息后需要存储,存储了会在会话界面显示

 具体代码:

package com.vc.ry;

import android.os.Parcel;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;


import java.io.UnsupportedEncodingException;

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

/**
 * 自定义消息的实体类
 * 
 */
@MessageTag(value = "ec:phoneinfo" ,flag = MessageTag.ISPERSISTED|MessageTag.ISCOUNTED)
public class PhoneInfo extends MessageContent {



    private String userName;

    private String phoneNum;


    public static PhoneInfo setPhoneData(String name,String num){
        PhoneInfo info =new PhoneInfo();
        info.userName =name;
        info.phoneNum = num;
        return info;
    }

    @Override
    public byte[] encode() {
        JSONObject object =new JSONObject();
        object.put("userName",userName);
        object.put("phoneNum",phoneNum);


        try {
            return object.toString().getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return null;
    }

    public PhoneInfo() {
    }

    public PhoneInfo(byte[] data) {
        super(data);
        String jsonStr=null;
        try {
            jsonStr =new String(data,"UTF-8");
            JSONObject object = JSON.parseObject(jsonStr);

            setUserName(object.getString("userName"));
            setPhoneNum(object.getString("phoneNum"));

        } catch (Exception e) {
            e.printStackTrace();
        }


    }






    @Override
    public void writeToParcel(Parcel dest, int flags) {
        ParcelUtils.writeToParcel(dest, userName);
        ParcelUtils.writeToParcel(dest,phoneNum);
    }

    public static final Creator CREATOR = new Creator() {

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

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


    public PhoneInfo(Parcel parcel){

        userName = ParcelUtils.readFromParcel(parcel);
        phoneNum = ParcelUtils.readFromParcel(parcel);
    }




    @Override
    public int describeContents() {
        return 0;
    }


    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }
}

3.设置自定义消息实体类的布局模板,有了实体类这个自定义的消息在界面上要怎么显示?这就需要我们给这个自定义的实体类设置他的布局

 3.1 新建一个PhoneProvider 继承 IContainerItemProvider.MessageProvider  messagecontent 是上面新建的PhoneInfo,同时实现 newView 和bindview 两个方法

 3.2 添加注解 ProviderTag 这个主要申明一下你这个布局是指向哪个messagecontent ,完了就是基础的配置可按照自己的要求进行添加 如下:

    boolean showPortrait() default true;  是否显示头像

    boolean centerInHorizontal() default false; 布局是否居中显示

    boolean hide() default false; 是否隐藏

    boolean showWarning() default true; 显示警告

    boolean showProgress() default true; 显示进度条

    boolean showSummaryWithName() default true;  显示描述

    boolean showReadState() default false;  显示读取状态

3.3 重写newView 和bindview ;newView 中就是写你自己定义的布局,binview就是赋值

 具体代码如下:

package com.vc.ry;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.text.Spannable;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;



import com.vc.ry.R;

import java.util.List;

import io.rong.imkit.model.ProviderTag;
import io.rong.imkit.model.UIMessage;
import io.rong.imkit.widget.provider.IContainerItemProvider;

/**
 * PhoneInfo的布局
 */
@ProviderTag(messageContent = PhoneInfo.class, showPortrait = false, centerInHorizontal = true)
public class PhoneProvider extends IContainerItemProvider.MessageProvider {

    private Context context;

    
    @Override
    public View newView(Context context, ViewGroup viewGroup) {
        this.context =context;
        View view = LayoutInflater.from(context).inflate(R.layout.ry_chat_phone_layout, viewGroup, false);
        PhoneHolder holder = new PhoneHolder();
        holder.phoneLayout = view.findViewById(R.id.ry_phone_layout);
        holder.desTv = view.findViewById(R.id.ry_chat_phone_des_tv);
        holder.phoneTv = view.findViewById(R.id.ry_chat_phone_tv);

        view.setTag(holder);
        return view;
    }

    @Override
    public void bindView(View view, int i, PhoneInfo phoneInfo, UIMessage uiMessage) {
        PhoneHolder holder = (PhoneHolder) view.getTag();
        holder.desTv.setText(phoneInfo.getUserName() + "的手机号:");
        holder.phoneTv.setText(phoneInfo.getPhoneNum());


    }

    @Override //这里意思是你的这个自定义消息显示的内容
    public Spannable getContentSummary(PhoneInfo phoneInfo) {
        return null;
    }

    @Override  //点击你的自定义消息执行的操作
    public void onItemClick(View view, int i, PhoneInfo phoneInfo, UIMessage uiMessage) {

        


    }

    






    class PhoneHolder{

        RelativeLayout phoneLayout;
        TextView desTv;
        TextView phoneTv;

    }


}

布局效果图:

融云系列之自定义消息_第1张图片

4.在APPLication中注册消息的模板 需要在初始化融云的之后注册

 

  RongIM.registerMessageType(PhoneInfo.class);
  RongIM.registerMessageTemplate(new PhoneProvider());

到这里消息的实体,布局我们都完工了,现在就要进入自定义消息的发送并且显示在会话界面上了。关于会话界面配置在这里也不赘述了。。。。。

5.自定义消息发送

 public void sendPhone(String name,String phone){

        final PhoneInfo info =new PhoneInfo();
       info.setUserName(name); 
     info.setPhoneNum(phone)
    //chatUserid 是接收消息方的id   Conversation.ConversationType 是消息会话的类型在这里表示的是私聊       
  Message message = Message.obtain(chatUserid,Conversation.ConversationType.PRIVATE,info); 


   RongIM.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() {
@Override //表示消息添加到本地数据库 
public void onAttached(Message message) { 

} 
@Override//消息发送成功
 public void onSuccess(Message message) { 

} 
@Override //消息发送失败 
public void onError(Message message, RongIMClient.ErrorCode errorCode) { 

}
 }); 

}

OK ,这个融云的自定义消息至此

 


你可能感兴趣的:(融云)