leancloud聊天室使用

最近由于需求需要建聊天室,后来使用了leancloud来做,这个以前免费的,后来企业级要收费了,具体的可以看官网

这里主要是建立聊天室,消息存储那些都是一次性的,所以这里主要讲几个方法,从建立聊天室,发送一条默认的消息,到别人加入聊天室,发送消息

github代码链接

首先是建立聊天室:

接入leancloud,只需要看管方的流程就可以完成了(这里是接入成功以后的使用)

      public void createChatRoom() {
            tom = AVIMClient.getInstance("Tom");
            tom.open(new AVIMClientCallback() {
                @Override
                public void done(AVIMClient client, AVIMException e) {
                    if (e == null) {
                        //登录成功
                        //创建一个 名为 "PK" 的暂态对话
                        client.createConversation(Collections.emptyList(), "PK", null, true,
                                new AVIMConversationCreatedCallback() {
    
                                    @Override
                                    public void done(AVIMConversation conv, AVIMException e) {
                                        if (e == null) {
                                            //获得一个 Id conv.getConversationId().惟一room的凭证
                                            //记得打印出来,这个数是随机生成的,记下来,之后加入这个聊天室要用 就是roomId
                                            mConverId = conv.getConversationId();
                                            sendMessage(mConverId,"创建聊天室成功");
                                            Log.i("----conv", conv.getConversationId());
                                            TomQueryWithLimit();
                                        } else {
                                            Log.i("----Fail", e.toString());
                                        }
                                    }
                                });
                    }
                }
            });
        }

以上代码建立了聊天室,并且获取到了getConversationId 这个id,这是一个聊天室惟一的凭证,

sendMessage(mConverId,"创建聊天室成功")和TomQueryWithLimit(),分别为发送第一条消息,和获取人数的方法

代码如下:

    /**
     * 进入聊天室后,发送一条消息
     *
     * @param
     */
    private void sendMessage(String sId, String msg) {
        //这是第一个人.创建聊天室的人
        AVIMConversation avimConversation = tom.getConversation(sId);//由id,得到聊天室的对象,发送消息,接收消息
        AVIMTextMessage avimTextMessage = new AVIMTextMessage();
        Map map = new HashMap<>();
        avimTextMessage.setAttrs(map);
        avimTextMessage.setText(msg);
        avimConversation.sendMessage(avimTextMessage, new AVIMConversationCallback() {
            @Override
            public void done(AVIMException e) {
                if (e == null) {
                    Log.i("发送成功", msg);
                } else {
                    e.printStackTrace();
                }
            }
        });
    }

获取人数:

//获取会话人数
    private void TomQueryWithLimit() {
        AVIMClient tom = AVIMClient.getInstance("Tom");
        tom.open(new AVIMClientCallback() {
            @Override
            public void done(AVIMClient client, AVIMException e) {
                if (e == null) {
                    //登录成功
                    AVIMConversationQuery query = tom.getQuery();
                    query.setLimit(1);
                    //获取第一个对话
                    query.findInBackground(new AVIMConversationQueryCallback() {
                        @Override
                        public void done(List convs, AVIMException e) {
                            if (e == null) {
                                if (convs != null && !convs.isEmpty()) {
                                    AVIMConversation conv = convs.get(0);
                                    //获取第一个对话的
                                    conv.getMemberCount(new AVIMConversationMemberCountCallback() {

                                        @Override
                                        public void done(Integer count, AVIMException e) {
                                            if (e == null) {
                                                Log.i("-----count", "conversation got " + count + " members");
                                            }
                                        }
                                    });
                                }
                            }
                        }
                    });
                }
            }
        });
    }

加入聊天室的方法如下:

  public void joinRoom() {
          //这是jerry加入聊天室
          jerry = AVIMClient.getInstance("Jerry");
          //建立连接
          jerry.open(new AVIMClientCallback() {
              @Override
              public void done(AVIMClient avimClient, AVIMException e) {
                  //获取聊天室
                  AVIMConversation avimConversation = jerry.getConversation(mConverId);
                  //加入聊天室
                  avimConversation.join(new AVIMConversationCallback() {
                      @Override
                      public void done(AVIMException e) {
                          if (e == null) {
                              //获取聊天室人数
                              Toast.makeText(ChatActivity.this, "joinsuccess", Toast.LENGTH_SHORT).show();
  
                              //发送一条默认消息,类型为MSG_NEWPEOPLE
                              sendMessages(mConverId, "jerry加入聊天室了");
                          } else {
                              Log.i("----roomjoinFail", e.toString());
                              Toast.makeText(ChatActivity.this, "roomjoinFail", Toast.LENGTH_SHORT).show();
  
                          }
                      }
                  });
              }
          });
      }

加入了聊天室,并且向聊天室发送了一条消息

发送消息都是一样的,这里需要获取convenientId ,由这个Id获取到聊天室的对象

sendMessages(mConverId, "jerry加入聊天室了")

    private void sendMessages(String roomId, String msg) {
        //这是加入聊天室的人
        AVIMConversation avimConversation = jerry.getConversation(roomId);//由id,得到聊天室的对象,发送消息,接收消息
        AVIMTextMessage avimTextMessage = new AVIMTextMessage();
        Map map = new HashMap<>();
        map.put("msg", "attr message");//发送附加消息,头像啥的都可以
        avimTextMessage.setAttrs(map);
        avimTextMessage.setText(msg);
        avimConversation.sendMessage(avimTextMessage, new AVIMConversationCallback() {
            @Override
            public void done(AVIMException e) {
                if (e == null) {
                    Log.i("发送成功", msg);
                } else {
                    e.printStackTrace();
                }
            }
        });
    }

其中聊天室主要由 mConverId = conv.getConversationId();这里获取到的id将所有人联系起来,这样才能加入到一起

消息获取

消息获取和官网提供的方法一样在APPLICATION里面,全局的获取

可以查看我的MyApp类 (MyApp extends Application)

public static class CustomMessageHandler extends AVIMMessageHandler {
        //接收到消息后的处理逻辑
        @Override
        public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client){
            if(message instanceof AVIMTextMessage){
                String from = ((AVIMTextMessage) message).getFrom();
                String name = (String)conversation.getAttribute("name");
//                Log.d("aa & bb",((AVIMTextMessage)message).getText());
                EventBus.getDefault().post(new OnEventMessage(((AVIMTextMessage)message).getText(),message));
            }
        }

        public void onMessageReceipt(AVIMMessage message,AVIMConversation conversation,AVIMClient client){

        }
    }

消息的获取用了EventBus来传对象,如下:

    /获到消息
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void onMessageEvent(OnEventMessage event) {/* Do something */
            AVIMMessage avimMessage = event.avimMessage;
            String from = avimMessage.getFrom();
    
            Map attrs = ((AVIMTextMessage) avimMessage).getAttrs();
            String attsMsg = (String) attrs.get("msg");//获取到的附加消息
            String chatMessage = ((AVIMTextMessage) avimMessage).getText();//获取到的文本消息
            Log.i("------msg",chatMessage+"---"+attsMsg);
            Toast.makeText(ChatActivity.this, chatMessage + "==" + attsMsg, Toast.LENGTH_SHORT).show();
            mList.add(chatMessage);
            mItemAdapter.notifyDataSetChanged();
            mRvChatlist.smoothScrollToPosition(mList.size()-1);
        }

以上就能获得消息了,具体的需要实际操作才能理解,只是做了一些简单的操作,可以建立聊天室,并且加入,实现双方的聊天功能

这里是销毁聊天室:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
        if (tom == null) {
            return;
        }
        AVIMConversation avimConversation = tom.getConversation(mConverId);
        avimConversation.quit(new AVIMConversationCallback() {
            @Override
            public void done(AVIMException e) {
                if (e == null) {
                }
                tom.close(new AVIMClientCallback() {
                    @Override
                    public void done(AVIMClient avimClient, AVIMException e) {
                        if (e == null) {
                        }
                    }
                });
            }
        });


    }

你可能感兴趣的:(leancloud聊天室使用)