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

来源:互联网 发布:百度云盘mac版下载 编辑:程序博客网 时间:2024/05/24 05:00

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

原创粉丝点击