1,自定义消息应在 init 后注册:

RongIM.registerMessageType(CustomizeMessage.class);  
RongIM.getInstance().registerMessageTemplate(new ZdyMessageProvider());

2,新建 CustomizeMessage 类继承 MessageContent,附上此类代码:

@MessageTag(value = "app:custom", flag = MessageTag.ISCOUNTED | MessageTag.ISPERSISTED)public class CustomizeMessage extends MessageContent {private String content;//消息属性,可随意定
    public CustomizeMessage(String content){this.content=content;
    }@Override
    public byte[] encode() {JSONObject jsonObj = new JSONObject();

        try {jsonObj.put("content",content);
        } catch (JSONException e) {Log.e("JSONException", e.getMessage());
        }try {return jsonObj.toString().getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {e.printStackTrace();
        }return null;
    }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("content"))content = jsonObj.optString("content");

        } catch (JSONException e) {Log.e("TAG", e.getMessage());
        }}//给消息赋值。
    public CustomizeMessage(Parcel in) {content= ParcelUtils.readFromParcel(in);//该类为工具类,消息属性

        //这里可继续增加你消息的属性
    }/**
     * 读取接口,目的是要从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];
        }};
    /**
     * 描述了包含在 Parcelable 对象排列信息中的特殊对象的类型。
     *
     * @return 一个标志位,表明Parcelable对象特殊对象类型集合的排列。
     */
    public int describeContents() {return 0;
    }/**
     * 将类的数据写入外部提供的 Parcel 中。
     *
     * @param dest  对象被写入的 Parcel     * @param flags 对象如何被写入的附加标志。
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {ParcelUtils.writeToParcel(dest, content);//该类为工具类,对消息中属性进行序列化

        //这里可继续增加你消息的属性
    }public String getContent() {return content;
    }
}

3,新建ZdyMessageProvider 类继承IContainerItemProvider.MessageProvider<CustomizeMessage>:

@ProviderTag(messageContent = CustomizeMessage.class)
public class ZdyMessageProvider extends IContainerItemProvider.MessageProvider<CustomizeMessage> {
private Context con;
private  int[] mDatas = new int[]{R.drawable.f000, R.drawable.f001, R.drawable.f002,
                                   R.drawable.f003, R.drawable.f004, R.drawable.f005};
private  String []bq={"[表情1]","[表情2]","[表情3]","[表情4]","[表情5]","[表情6]"};
private  int[] imageIds =new int[6];
    class ViewHolder {ImageView message;
    }@Override
    public View newView(Context context, ViewGroup group) {View view = LayoutInflater.from(context).inflate(R.layout.item, null);
        ViewHolder holder = new ViewHolder();
        holder.message = (ImageView) view.findViewById(R.id.text);
        view.setTag(holder);
        con=context;
        return view;
    }
@Override
public void bindView(View view, int i, CustomizeMessage customizeMessage, UIMessage uiMessage) {ViewHolder holder= (ViewHolder) view.getTag();
    if(uiMessage.getMessageDirection()== Message.MessageDirection.SEND){String strr=customizeMessage.getContent();
     for(int j=0;j<bq.length;j++){
        if(strr.equals(bq[j]))holder.message.setBackgroundResource(mDatas[j]);}}else {        String strr=customizeMessage.getContent();
        for(int k=0;k<bq.length;k++){if(strr.equals(bq[k]))holder.message.setBackgroundResource(mDatas[k]);}}
}@Override
    public Spannable getContentSummary(CustomizeMessage data) {        return new SpannableString(data.getContent());//自定义的消息内容展示
    }@Override
    public void onItemClick(View view, int i, CustomizeMessage customizeMessage, UIMessage uiMessage) {}@Override
    public void onItemLongClick(final View view, int i, final CustomizeMessage customizeMessage
    , final UIMessage uiMessage) {//长按删除事件
     String[] items1;//删除
     items1 = new String[]{view.getContext().getResources().
     getString(io.rong.imkit.R.string.rc_dialog_item_message_delete)};
     OptionsPopupDialog.newInstance(view.getContext(), items1).setOptionsPopupDialogListener
     (new OptionsPopupDialog.OnOptionsItemClickedListener() {public void onOptionsItemClicked(int which) {if (which == 0) {RongIM.getInstance().deleteMessages(new int[]{uiMessage.getMessageId()}
      , (RongIMClient.ResultCallback) null);
        }}}).show();
    }}

4,点击表情时发送一条自定义的消息,这个方法需要在自定义的表情tab页调用

private void sendzdymessage(int position,String groupId) {    CustomizeMessage c= new CustomizeMessage(bq[position]);
    byte[] b=c.encode();
    CustomizeMessage mes=new CustomizeMessage(b);
    Message myMessage = Message.obtain(groupId, Conversation.ConversationType.GROUP, mes);
    RongIM.getInstance().sendMessage(myMessage,"cc",null, new IRongCallback.ISendMessageCallback() {@Override
        public void onAttached(Message message) {//消息本地数据库存储成功的回调
            Log.e("TAG",message.toString());
        }@Override
        public void onSuccess(Message message) {//消息通过网络发送成功的回调
            Log.e("TAG",message.toString());
        }@Override
        public void onError(Message message, RongIMClient.ErrorCode errorCode) {//消息发送失败的回调
            Log.e("TAG",message.toString());
        }});
}

利用自定义消息的方式发送自定义的表情,需要IOS端也用这种方法,否则IOS端将收不到安卓端发送过来的自定义消息噢。

融云利用自定义消息的方式发送自定义表情相关推荐

  1. 融云超级群的「新能力」

    作为构建实时社区的第一选择,融云超级群自发布以来很好地满足了类 Discord 实时社区业务场景的客户需求.关注[融云全球互联网通信云]了解更多 随着服务的不断推进,融云超级群服务也在持续更新迭代,以 ...

  2. 【融云分析】选择IM云服务,需要看哪些核心技术指标?

    IM(即时通讯)云服务已发展数年,不少企业与开发者都倾向于选择第三方IM云服务,短平快地为应用添加即时通讯能力,但如何选择服务商却是个难题,单从简单的功能介绍来看无法判断,因为IM云服务接入后,更重要 ...

  3. 场景实践 | 如何使用融云超级群构建游戏社区

    我们的"在线"时间越来越长了.关注[融云全球互联网通信云]了解更多 在电竞内容体验方面尤其如此.根据艾瑞咨询数据,在 2021 年中国电竞用户中,平均每周玩 11-20 小时电竞游 ...

  4. 融云服务器实时消息路由,IM 北极星产品功能介绍

    IM 北极星 概述 IM 北极星主要为开发者提供了终端用户连接及消息发送状态查询功能:通过查看用户的连接日志,判断用户某时间段内是否可以正常使用融云服务,如:用户反馈消息发送不成功,可能是因为该用户在 ...

  5. 专业、简单、稳定,融云重新定义互联网通信云服务

    艾瑞咨询<2023 年全球互联网通信云行业研究报告>(下简称<报告>)显示,79.1% 的开发者计划或已经出海,其中已将应用推到海外的开发者占比 43%.关注[融云全球互联网通 ...

  6. 行业独角兽的背后——融云保障陆金所百万用户数据安全固若金汤

    2017年11月底,我国互联网金融业务年度总成交量高达25800亿元,较2016年同期增长47.8%.在行业发展势头强劲的大环境下,如何稳固的为用户提供优质服务.保障数据安全.提供特色产品已成为互联网 ...

  7. 融云IM整理 01--- (API)

    融云IM整理 01- (API) ###常用的的方法有 获取Token 链接融云服务器 发文本消息 发送图片消息 发送语音消息 发送文件消息 发送自定义消息 插入消息(只在本地存储,不发送) 获取本地 ...

  8. 融云 Unity SDK 升级,专注游戏场景,更好社交体验

    游戏已经不单单是一种娱乐方式.关注[融云全球互联网通信云]了解更多 作为离元宇宙最近的赛道,游戏不仅是各种沉浸式体验类技术落地融合的首发场景,也是创作者经济爆发的热土. 移动游戏在人们的线上消费方面势 ...

  9. 融云 WICC 剧透:“安全”出海不触礁,全球合规指南一网打尽

    2020 年,全球顶级电子游戏开发工作室"顽皮狗"(Naughty Dog)旗下的<美国末日2>在中东遭到下架,原因是 ESRB(娱乐软件分级委员会)对该游戏的评级为包 ...

最新文章

  1. php7 swoole 扩展,PHP7.2加入swoole扩展
  2. java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...
  3. 深入浅出!阿里运维专家三种方法教你如何应对高并发“海啸”场景
  4. 你敢在post和get上刁难我,就别怪我装逼了
  5. 基于直方图处理的图像增强
  6. Question of the Day: Microsoft | Database, Multiple Questions in One
  7. eclipse下的jrebel配置
  8. python+办公自动化_Python办公自动化之操作excel
  9. mysql net 指令_MySQL命令
  10. C++ typename的使用方式
  11. UVa10047 BFS
  12. 如何看懂时序图LCD1602(经典)
  13. 调用阿里API获取城市天气信息
  14. 微信公众号实现消息模板的推送
  15. 苹果输入法怎么换行_朋友圈长文字不折叠输入法,复制粘贴避免只显示一行
  16. WSJ Merkel Top On Forbes' Most Powerful Women List For 4th Year
  17. 你不知道的网站图片存储格式-base64
  18. 达梦数据库逻辑备份(dexp/dimp)
  19. 战舰帝国服务器维护,【图片】9月17日更新公告亲爱的司令官:《战舰帝国》于9月17日维护,成功更新后可以获得200个钻石的更新补偿_战舰帝国吧_百度贴吧...
  20. 数据化建设知识图谱(文末附PDF下载)

热门文章

  1. 面试中常被问到(四)C/C++中数组,指针和引用的区别
  2. 为什么勒贝格积分比黎曼积分强?
  3. java的rest教程_[Java教程]SpringMVC的REST风格的四种请求方式
  4. 物联网设备的使用案例及管理系统
  5. 三星emmc芯片手册_聊聊存储器EMMC与DDR的那些事儿~~~
  6. 从本地html提取表格,如何从这个网页提取表格数据,做成电子表格呢?谢谢
  7. js 匿名函数自调用
  8. oracle数据库是三级模式结构,什么是数据库三级模式结构?
  9. [数字媒体] PR视频剪辑之自定义音频、视频加速转场和特显停顿
  10. 欧几里得最短距离公式_欧几里得度量(欧氏距离)