融云实现自定义消息的分享功能

1.为什么要实现自定义消息

正如我们自己的app,要实现在分享功能,并且分享的类型也不是固定的传统的分享,同时还可以点击跳转,用传统的融云分享格式是满足不了需求,这就用到了融云自定义消息

2. 怎么去实现自定义分享

  1. 首先我们应该自定义一个消息类继承融云MessageContent这个类,重写其中的encode方法,将json串转换为byte数组,其中shareTittle等都是在需要在分享中使用的字段,这个地方的键值要与IOS统一,否则会产生无法同步现象

      @Override
        public byte[] encode() {
            JSONObject jsonObject = new JSONObject();
    
            try {
                jsonObject.put("shareTitle",shareTitle);
                jsonObject.put("shareDescription",shareDescription);
                jsonObject.put("shareImageStr",shareImageStr);
                jsonObject.put("shareId",shareId);
                jsonObject.put("shareUrl",shareUrl);
                jsonObject.put("extra",extra);
                jsonObject.put("shareType",shareType);
            }catch (JSONException e){
                e.printStackTrace();
            }
    
            try {
                return jsonObject.toString().getBytes("UTF-8");
            }catch (UnsupportedEncodingException e){
                e.printStackTrace();
            }
            return null;
        }
    
    1. 重写父类的构造器,其中参数是byte[],将相应的byte[] 转换为json字符串,并将json中的数据赋给该类的字段

        public  ShareMessageContent(byte[] data) {
              String jsonStr = null;
              try {
                  jsonStr = new String(data, "UTF-8");
              } catch (UnsupportedEncodingException e1) {
      
              }
              try {
                  JSONObject jsonObj = new JSONObject(jsonStr);
                  if(jsonObj.has("shareTitle"))
                      shareTitle = jsonObj.optString("shareTitle");
      
                  if(jsonObj.has("shareDescription"))
                      shareDescription = jsonObj.optString("shareDescription");
      
                  if(jsonObj.has("shareImageStr"))
                      shareImageStr = jsonObj.optString("shareImageStr");
      
                  if(jsonObj.has("shareId"))
                      shareId = jsonObj.optString("shareId");
      
                  if(jsonObj.has("shareUrl"))
                      shareUrl = jsonObj.optString("shareUrl");
      
                  if(jsonObj.has("extra"))
                      extra = jsonObj.optString("extra");
      
                  if(jsonObj.has("shareType"))
                      shareType = jsonObj.optString("shareType");
      
              } catch (JSONException e) {
                  e.printStackTrace();
              }
      
      
          }
      
      1. 建立以parcel为参数的构造器,并重写writeToParcel方法,这里面用到融云的工具类ParcelUtils,这两个方法必须一一对应,否则会使数据错乱
       /**
           * 以下两个方法必须顺序必须一一对应否则会出现数据混乱
           * @param in
           */
          public ShareMessageContent(Parcel in){
              setShareTitle(ParcelUtils.readFromParcel(in)); //该类为工具了,消息属性
              setShareDescription(ParcelUtils.readFromParcel(in));
              setShareImageStr(ParcelUtils.readFromParcel(in));
              setShareId(ParcelUtils.readFromParcel(in));
              setShareUrl(ParcelUtils.readFromParcel(in));
              setExtra(ParcelUtils.readFromParcel(in));
              setShareType(ParcelUtils.readFromParcel(in));
      
          }
          /**
           * 将类的数据写入外部提供的parcel中
           * @param dest 对象被写入Parcel
           * @param flags 对象如何被写入的附加标志
           */
          @Override
          public void writeToParcel(Parcel dest, int flags) {
              ParcelUtils.writeToParcel(dest,getShareTitle());
              ParcelUtils.writeToParcel(dest,getShareDescription());
              ParcelUtils.writeToParcel(dest,getShareImageStr());
              ParcelUtils.writeToParcel(dest,getShareId());
              ParcelUtils.writeToParcel(dest,getShareUrl());
              ParcelUtils.writeToParcel(dest,getExtra());
              ParcelUtils.writeToParcel(dest,getShareType());
          }  
      
      1. 实现 Parcelable中的方法Creator方法,同时重写相应的describeContents()方法

         /**
             * 读取接口,目的要从Parcel中构造一个实现了Parcelable的类的实例处理
             */
            public static  final Creator<ShareMessageContent> CREATOR = new Creator<ShareMessageContent>() {
                @Override
                public ShareMessageContent createFromParcel(Parcel source) {
                    return new ShareMessageContent(source);
                }
        
                @Override
                public ShareMessageContent[] newArray(int size) {
                    return new ShareMessageContent[size];
                }
            };
            
              /**
           * 描述了包含在 Parcelable 对象排列信息中的特殊对象的类型。
           *
           * @return 一个标志位,表明Parcelable对象特殊对象类型集合的排列。
           */
          public int describeContents() {
              return 0;
          }
        
        
        
        1. 在该model上添加注解信息,以便于融云识别,其中注意属性value1必须是唯一不可重复的标识,同时也是应该和ios定义的城一个字段。

          @MessageTag(value = "app:custom", flag = MessageTag.ISCOUNTED | MessageTag.ISPERSISTED)
          public class CustomizeMessage extends MessageContent {
            ...
          }
          
        2. 注册自定义消息,注册在application中进行注册:

          RongIM.registerMessageType(CustomizeMessage.class);  
          
        3. 消息展示创建一个消息提供者,继承IContainerProvider.MessageProvider类,实现其中的5个方法newView (),bingView(),getContentSummary(),onItemClick(),onItemLongClick(),代码如下

          /**
           * desc新建一个消息类继承IContainerItemProvider.MessageProvider类,实现对应接口的方法
           * 1.注意开头的注解
           * 2.注意泛型
           */
          @ProviderTag(messageContent = ShareMessageContent.class, showReadState = true)
          public class ShareMessageContentItemProvider extends IContainerItemProvider.MessageProvider<ShareMessageContent> {
          
              public ShareMessageContentItemProvider() {
              }
          
              @Override
              public View newView(Context context, ViewGroup viewGroup) {
          
                  View view = LayoutInflater.from(context).inflate(R.layout.item_share_message_rongyun, null);
                  ViewHolder holder = new ViewHolder();
          
                  //控件id
                  //类型1
                  holder.rl_item1 = (RelativeLayout) view.findViewById(R.id.rl_item1);
                  holder.tv_item1_title = (TextView) view.findViewById(R.id.tv_item1_title);
                  holder.tv_item1_description = (TextView) view.findViewById(R.id.tv_item1_description);
                  holder.iv_item1_img = (ImageView) view.findViewById(R.id.iv_item1_img);
          
                  //类型二
                  holder.rl_item2 = (RelativeLayout) view.findViewById(R.id.rl_item2);
                  holder.iv_item2_img = (ImageView) view.findViewById(R.id.iv_item2_img);
                  holder.tv_item2_title = (TextView) view.findViewById(R.id.tv_item2_title);
          
                  //类型三
          //        holder.rl_item3 = (RelativeLayout) view.findViewById(R.id.rl_item3);
          //        holder.iv_item3_img = (ImageView) view.findViewById(R.id.iv_item3_img);
          
          
                  view.setTag(holder);
                  return view;
              }
          
              @Override
              public void bindView(View view, int i, ShareMessageContent content, UIMessage message) {
                  ViewHolder holder = (ViewHolder) view.getTag();
          //        if(message.getMessageDirection() == Message.MessageDirection.SEND){
          //            view.setBackgroundResource(io.rong.imkit.R.drawable.rc_ic_bubble_right);
          //
          //        }else {
          //            view.setBackgroundResource(io.rong.imkit.R.drawable.rc_ic_bubble_left);
          //        }
          
                  if (content != null) {
                      //item1 //资讯,活动,成果转化
                      if (content.getShareType().equals(ShareTypeModel.SHARETYPENEWS) ||
                              content.getShareType().equals(ShareTypeModel.SHARETYPEACTIVE)
                              || content.getShareType().equals(ShareTypeModel.SHARETYPESCIENCERESULIT)
                              ||content.getShareType().equals(ShareTypeModel.SHARETYPECOMPANYNEED)) {
                          holder.rl_item1.setVisibility(View.VISIBLE);
                          holder.rl_item2.setVisibility(View.GONE);
          //                holder.rl_item3.setVisibility(View.GONE);
          
                          holder.tv_item1_title.setText(content.getShareTitle());
                          holder.tv_item1_description.setText(content.getShareDescription());
                          if(!TextUtils.isEmpty(content.getShareImageStr())){
                              ImageLoader.loadpic2(view.getContext(), content.getShareImageStr(), holder.iv_item1_img);
                          }
                          else{
                              holder.iv_item1_img.setBackgroundResource(R.mipmap.zhanweitu);
                          }
          //                ImageLoader.loadpic2(view.getContext(), content.getShareImageStr(), holder.iv_item1_img);
          
          
                      } else if (content.getShareType().equals(ShareTypeModel.SHARETYPELEARNSOCIETY) ||
                              content.getShareType().equals(ShareTypeModel.SHARETYPETRIBE) ||
                              content.getShareType().equals(ShareTypeModel.SHARETYPETOPIC) ||
                              content.getShareType().equals(ShareTypeModel.SHARETYPEVIDEO) ||
                              content.getShareType().equals(ShareTypeModel.SHARETYPEMETTING) ||
                              content.getShareType().equals(ShareTypeModel.SHARETYPECIRCLE) ||
                              content.getShareType().equals(ShareTypeModel.SHARETYPEWARNING) ||
                              content.getShareType().equals(ShareTypeModel.SHARETYPEWEBLINK)) {
                          //item2
                          holder.rl_item1.setVisibility(View.GONE);
                          holder.rl_item2.setVisibility(View.VISIBLE);
          //                holder.rl_item3.setVisibility(View.GONE);
                          holder.tv_item2_title.setText(content.getShareTitle());
                          if(!TextUtils.isEmpty(content.getShareImageStr())){
                              ImageLoader.loadpic2(view.getContext(), content.getShareImageStr(), holder.iv_item2_img);
                          }
                          else{
                              holder.iv_item2_img.setBackgroundResource(R.mipmap.zhanweitu);
                          }
          //                ImageLoader.loadpic2(view.getContext(), content.getShareImageStr(), holder.iv_item2_img);
          
                      }
          //            else if(content.getShareType().equals(ShareTypeModel.SHARETYPESCREENPIC)){
          //                holder.rl_item3.setVisibility(View.VISIBLE);
          //                holder.rl_item1.setVisibility(View.GONE);
          //                holder.rl_item2.setVisibility(View.GONE);
          //                String shareImageStr = content.getShareImageStr();
          //                if(!TextUtils.isEmpty(shareImageStr)){
          //                    ImageLoader.loadpic(view.getContext(),content.getShareImageStr(),holder.iv_item3_img);
          //                }
          //            }
                  }
              }
          
              @Override
              public Spannable getContentSummary(ShareMessageContent content) {
                  return new SpannableString("<链接>"+content.getShareTitle());
              }
          
              //点击监听
              @Override
              public void onItemClick(View view, int i, ShareMessageContent shareMessageContent, UIMessage uiMessage) {
                  LogUtils.d("---->>", "---->> shareMessageContent = " + shareMessageContent.toString());
                  //这里处理相应的跳转
                  if (shareMessageContent != null && !TextUtils.isEmpty(shareMessageContent.getShareType())) {
                      String type = shareMessageContent.getShareType();
                      if (type.equals(ShareTypeModel.SHARETYPENEWS)) { //这是跳转到咨询
                          Intent intent = new Intent(view.getContext(), NewsDetailActivity.class);
                          intent.putExtra("id", shareMessageContent.getShareId());
                          view.getContext().startActivity(intent);
          
                      } else if (type.equals(ShareTypeModel.SHARETYPELEARNSOCIETY)) { //这是跳转到协会
                          Intent intent = new Intent(view.getContext(), AssociationMainPageActivity.class);
                          intent.putExtra("id", shareMessageContent.getShareId());
                          view.getContext().startActivity(intent);
                      } else if (type.equals(ShareTypeModel.SHARETYPETRIBE)) { //兴趣部落
                          view.getContext().startActivity(new Intent(view.getContext(), InterestClubHomeActivity.class).putExtra("gid", shareMessageContent.getShareId()));
                      } else if (type.equals(ShareTypeModel.SHARETYPETOPIC)) { //话题
                          Intent intent = new Intent(view.getContext(), TopicActivity.class);
                          intent.putExtra("topic_id", shareMessageContent.getShareId());
                          intent.putExtra("topic_name", "#" + shareMessageContent.getShareTitle() + "#");
                          view.getContext().startActivity(intent);
                      } else if (type.equals(ShareTypeModel.SHARETYPEACTIVE)) { //视频活动
                          Intent intent = new Intent(view.getContext(), Intent_Activity.class);
                          intent.putExtra("url", shareMessageContent.getShareUrl());
                          view.getContext().startActivity(intent);
          
                      } else if (type.equals(ShareTypeModel.SHARETYPECIRCLE)) { //科猫圈
                          Intent intent = new Intent(view.getContext(), WeiboDetailActivity3.class);
                          intent.putExtra("id", shareMessageContent.getShareId());
                          view.getContext().startActivity(intent);
                      } else if (type.equals(ShareTypeModel.SHARETYPESCIENCERESULIT)) { //科技成果
                          Intent intent = new Intent(view.getContext(), TransformKejiDetailActivity.class);
                          intent.putExtra("id", shareMessageContent.getShareId());
                          view.getContext().startActivity(intent);
          
                      } else if (type.equals(ShareTypeModel.SHARETYPEVIDEO)) { //视频
                          Intent intent = new Intent(view.getContext(), VideosDetailActivity.class);
                          intent.putExtra("videoid", shareMessageContent.getShareId());
                          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                          view.getContext().startActivity(intent);
                      } else if (type.equals(ShareTypeModel.SHARETYPEMETTING)) { //会议
                          Intent intent = new Intent(view.getContext(), MeetingDetailActivity.class);
                          intent.putExtra("id", shareMessageContent.getShareId());
                          view.getContext().startActivity(intent);
          
                      } else if (type.equals(ShareTypeModel.SHARETYPEWARNING)) {
          
                      } else if (type.equals(ShareTypeModel.SHARETYPECOMPANYNEED)) {
                          Intent intent = new Intent(view.getContext(), TransformBusinessDetailActivity.class);
                          intent.putExtra("id", shareMessageContent.getShareId());
                          view.getContext().startActivity(intent);
                      } else if (type.equals(ShareTypeModel.SHARETYPEWEBLINK)) {
                          Intent intent = new Intent(view.getContext(), Intent_Activity.class);
                          intent.putExtra("url", shareMessageContent.getShareUrl());
                          view.getContext().startActivity(intent);
                      }
                  }
              }
          
              //长按监听
              @Override
              public void onItemLongClick(final View view, int i, final ShareMessageContent content, final UIMessage uiMessage) {
                  //实现长按删除等功能,直接复制融云其他provider的实现
                  String[] items; // 复制,删除
                  items = new String[]{view.getContext().getResources().getString(R.string.rc_dialog_item_message_copy), view.getResources().getString(R.string.rc_dialog_item_message_delete)};
          
                  OptionsPopupDialog.newInstance(view.getContext(), items).setOptionsPopupDialogListener(new OptionsPopupDialog.OnOptionsItemClickedListener() {
                      @Override
                      public void onOptionsItemClicked(int i) {
                          switch (i) {
                              case 0:
                                  ClipboardManager clipboard = (ClipboardManager) view.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
                                  clipboard.setText(TextUtils.isEmpty(content.getShareUrl()) ? content.getShareTitle() : content.getShareUrl());
                                  break;
                              case 1:
                                  RongIM.getInstance().deleteMessages(new int[]{uiMessage.getMessageId()}, (RongIMClient.ResultCallback) null);
                                  break;
                          }
                      }
                  }).show();
              }
          
          
              class ViewHolder {
                  RelativeLayout rl_item1, rl_item2;
                  TextView tv_item1_title, tv_item1_description, tv_item2_title;
                  ImageView iv_item1_img, iv_item2_img;
          
              }
          
          }
          
          1. 发送,通过初始化model类将,将该model放在Message中的content中,通过RongIM.getInstance().sendMesssage发出去。

                //开始发送消息
                            //进行分享的操作
                            Gson gson = new Gson();
                            String s = gson.toJson(shareModel); //将一个model转化为json字符串
                            byte[] data = s.getBytes(); //将string转换为byte
                            ShareMessageContent shareMessageContent = new ShareMessageContent(data);
            
                            io.rong.imlib.model.Message message = new io.rong.imlib.model.Message();
                            message.setContent(shareMessageContent);
                            message.setTargetId(bean.getUid() + "");
                            message.setConversationType(Conversation.ConversationType.PRIVATE);
                            message.setMessageDirection(io.rong.imlib.model.Message.MessageDirection.SEND);
            
                            final String inputContent = input_et.getText().toString();
                            LogUtils.d("---->>", "---->> inputContent == " + input_et.getText().toString());
                            final String text = TextUtils.isEmpty(inputContent) ? "" : inputContent;
                            number_tv.setVisibility(View.GONE);
                            LogUtils.d("---->>", "---->> text == " + text);
            
                            RongIM.getInstance().sendMessage(message, text, text, new IRongCallback.ISendMediaMessageCallback() {
                                @Override
                                public void onProgress(io.rong.imlib.model.Message message, int i) {
            
                                }
            
                                @Override
                                public void onCanceled(io.rong.imlib.model.Message message) {
                                    pop.dismiss();
                                }
            
                                @Override
                                public void onAttached(io.rong.imlib.model.Message message) {
            
                                }
            
                                @Override
                                public void onSuccess(io.rong.imlib.model.Message message) {
                                    if (!TextUtils.isEmpty(text)) {
                                        TextMessage txtMsg = TextMessage.obtain(text);
                                        io.rong.imlib.model.Message message1 = io.rong.imlib.model.Message.obtain(bean.getUid() + "", Conversation.ConversationType.PRIVATE, txtMsg);
                                        RongIM.getInstance().sendMessage(message1, null, null, new IRongCallback.ISendMediaMessageCallback() {
                                            @Override
                                            public void onProgress(io.rong.imlib.model.Message message, int i) {
            
                                            }
            
                                            @Override
                                            public void onCanceled(io.rong.imlib.model.Message message) {
            
                                            }
            
                                            @Override
                                            public void onAttached(io.rong.imlib.model.Message message) {
            
                                            }
            
                                            @Override
                                            public void onSuccess(io.rong.imlib.model.Message message) {
                                                ToastUtil.show(context, "分享成功");
                                                pop.dismiss();
                                                finish();
                                            }
            
                                            @Override
                                            public void onError(io.rong.imlib.model.Message message, RongIMClient.ErrorCode errorCode) {
                                                pop.dismiss();
                                            }
                                        });
                                    } else {
                                        ToastUtil.show(context, "分享成功");
                                        pop.dismiss();
                                        finish();
                                    }
            
                                }
            
                                @Override
                                public void onError(io.rong.imlib.model.Message message, RongIMClient.ErrorCode errorCode) {
                                    pop.dismiss();
                                }
                            });
                        }
                    });
            

          9.融云传送门

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容