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

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端将收不到安卓端发送过来的自定义消息噢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值