美文网首页
04_环信集成 app 即时通讯功能基础-消息

04_环信集成 app 即时通讯功能基础-消息

作者: Android_小生 | 来源:发表于2017-10-17 17:42 被阅读49次

    发送消息

    可以发送文本、语音、图片、位置等消息(单聊/群聊通用)。

    -------------------创建消息--------------------
    //创建文本消息
    //content为消息文字内容,toChatUsername为对方用户或者群聊的id,后文皆是如此
    EMMessage message = EMMessage.createTxtSendMessage(content, toChatUsername);
    
    //创建语音消息
    //filePath为语音文件路径,length为录音时间(秒)
    EMMessage message = EMMessage.createVoiceSendMessage(filePath, length, toChatUsername);
    
    //创建视频消息
    //videoPath为视频本地路径,thumbPath为视频预览图路径,videoLength为视频时间长度
    EMMessage message = EMMessage.createVideoSendMessage(videoPath, thumbPath, videoLength, toChatUsername);
    
    //创建图片消息
    //imagePath为图片本地路径,false为不发送原图(默认超过100k的图片会压缩后发给对方),需要发送原图传true
    EMMessage message = EMMessage.createImageSendMessage(imagePath, false, toChatUsername);
    
    //创建地理位置消息
    //latitude为纬度,longitude为经度,locationAddress为具体位置内容
    EMMessage message = EMMessage.createLocationSendMessage(latitude, longitude, locationAddress, toChatUsername);
    
    //创建文件消息
    EMMessage message = EMMessage.createFileSendMessage(filePath, toChatUsername);
    
    //创建透传消息
    EMMessage message = EMMessage.createSendMessage(EMMessage.Type.CMD);
    //支持单聊和群聊,默认单聊,如果是群聊添加下面这行
    message.setChatType(ChatType.GroupChat)
    String action="action1";//action可以自定义
    EMCmdMessageBody cmdBody = new EMCmdMessageBody(action);
    String toUsername = "test1";//发送给某个人
    message.setReceipt(toUsername);
    message.addBody(cmdBody); 
    
    -------------------发送消息-----------------
    sendMessage(message);
    
    //发送消息
    protected void sendMessage(EMMessage message){
            if (message == null) {
                return;
            }
            if(chatFragmentHelper != null){
                //set extension
                chatFragmentHelper.onSetMessageAttributes(message);
            }
            if (chatType == EaseConstant.CHATTYPE_GROUP){
                message.setChatType(ChatType.GroupChat);
            }else if(chatType == EaseConstant.CHATTYPE_CHATROOM){
                message.setChatType(ChatType.ChatRoom);
            }
            //send message
            EMClient.getInstance().chatManager().sendMessage(message);
            //refresh ui
            ...
        }
    

    接收消息

    通过注册消息监听来接收消息。

    EMClient.getInstance().chatManager().addMessageListener(msgListener);
    EMMessageListener msgListener = new EMMessageListener() {
        
        @Override
        public void onMessageReceived(List<EMMessage> messages) {
            //收到消息
            //刷新消息列表
        }
        
        @Override
        public void onCmdMessageReceived(List<EMMessage> messages) {
            //收到透传消息
            //刷新消息列表
        }
        
        @Override
        public void onMessageRead(List<EMMessage> messages) {
            //收到已读回执
            //刷新消息列表
        }
        
        @Override
        public void onMessageDelivered(List<EMMessage> message) {
            //收到已送达回执
            //刷新消息列表
        }
           @Override
        public void onMessageRecalled(List<EMMessage> messages) {
            //消息被撤回
            //刷新消息列表
        }
        
        @Override
        public void onMessageChanged(EMMessage message, Object change) {
            //消息状态变动
            //刷新消息列表
        }
    };
    
    //记得在不需要的时候移除listener,如在activity的onDestroy()时
    EMClient.getInstance().chatManager().removeMessageListener(msgListener);
    

    获取聊天记录

    EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username);
    //获取此会话的所有消息
    List<EMMessage> messages = conversation.getAllMessages();
    //SDK初始化加载的聊天记录为20条,到顶时需要去DB里获取更多
    //获取startMsgId之前的pagesize条消息,此方法获取的messages SDK会自动存入到此会话中,APP中无需再次把获取到的messages添加到会话中
    List<EMMessage> messages = conversation.loadMoreMsgFromDB(startMsgId, pagesize);
    

    获取未读消息数量

    EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username);
    conversation.getUnreadMsgCount();
    

    未读消息数清零

    EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username);
    //指定会话消息未读数清零
    conversation.markAllMessagesAsRead();
    //把一条消息置为已读
    conversation.markMessageAsRead(messageId);
    //所有未读消息数清零
    EMClient.getInstance().chatManager().markAllConversationsAsRead();
    

    撤回消息功能

    消息撤回功能可以撤回一定时间内发送出去的消息,目前只能是两分钟,不能修改(此功能属于增值服务,需要联系商务同事开通)

    EMClient.getInstance().chatManager().recallMessage(contextMenuMessage);
    

    分页获取历史消息记录

    try {
        EMClient.getInstance().chatManager().fetchHistoryMessages(
                toChatUsername, EaseCommonUtils.getConversationType(chatType), pagesize, "");
        final List<EMMessage> msgs = conversation.getAllMessages();
        int msgCount = msgs != null ? msgs.size() : 0;
        if (msgCount < conversation.getAllMsgCount() && msgCount < pagesize) {
            String msgId = null;
            if (msgs != null && msgs.size() > 0) {
                msgId = msgs.get(0).getMsgId();
            }
            conversation.loadMoreMsgFromDB(msgId, pagesize - msgCount);
        }
        messageList.refreshSelectLast();
    } catch (HyphenateException e) {
        e.printStackTrace();
    }
    

    文章只是作为自己记录学习使用,如果有使用不当的地方可以@我,谢谢。
    参考文章:环信开发文档

    相关文章

      网友评论

          本文标题:04_环信集成 app 即时通讯功能基础-消息

          本文链接:https://www.haomeiwen.com/subject/cnsduxtx.html