融云系列之自定义消息

每次当自己要写文章的时候就觉得,怎么上一次写文章都过去了这么久,真是服了自己了,本着后来者少走弯路的原则,再加上融云的文档写的那叫一个简明(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<PhoneInfo> CREATOR = new Creator<PhoneInfo>() {
 
        @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>  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<PhoneInfo> {
 
    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;
 
    }
 
 
}
布局效果图:

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) { 
 
}
 }); 
 
}
 ———————————————— 
版权声明:本文为CSDN博主「vincecarterhu」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014289767/article/details/80648797

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值