espace二次开发-已读回执与阅后即焚功能

//espace二次开发-已读回执与阅后即焚功能

eSpace中消息回执及阅后即焚相关实现文档

在即时通讯中,消息发送后发送方收到回执的形式可以作为重要消息的方式来进行,还有就是阅后即焚也是即时消息里相关的专利,这些专利在专利系统里相对来说不是很多,以下专利均来自SooPAT搜索。

1. 一种即时通讯消息回执方法及系统

本技术方案适用于即时通讯技术领域,提供了一种即时通讯消息回执方法及系统,所述方法包括 :接收包含消息回执参数以及消息正文的数据包 ;解析所述数据包,根据所述数据包中的消息回执参数确定消息发送端是否需要回执 ;在确定所述消息发送端需要回执时,获取对所述数据包的处理结果,并根据所述处理结果生成回执信息 ;将所述回执信息反馈给所述消息发送端。 通过本技术方案,可实现即时通讯回执业务,方便消息发送端及时、准确的掌握消息发送过程中的各种状态。。

## 背景技术 ##
现有eSpace支持消息类业务通信,用户可以通过消息类业务进行聊天、通知等日常活动。 消息类业务虽然有形式灵活、方便快捷等诸多优点。 然而,由于消息类业务具有非实时性的特点,现有即时通讯工具的消息类业务只是简单的通过服务器转发在线消息或者缓存离线消息,对于消息发送过程中的状态以及接收方对消息的处理状态 ( 例如是否已读取等 ) 都无法获知。 在某些特定即时通讯应用场合中,比如公司发布的重要通知、产品信息的公布等,消息发送方需要确保消息接收方能够及时的接收并阅读所发送的消息,以便于后续工作的开展。 因此,及时、准确的掌握消息的处理状态显得尤其重要。

技术方案

本需求的目的在于提供一种即时通讯消息回执方法,以解决现有技术无法获取消息处理状态的问题。

此需求即时通讯消息回执方法包括 :

1.接收包含消息回执参数以及消息正文的数据包 ;

2.解析所述数据包,根据所述数据包中的消息回执参数确定消息发送端是否需要回执 ;

3.在确定所述消息发送端需要回执时,获取对所述数据包的处理结果,并根据所述处理结果生成回执信息 ;

4.将所述回执信息反馈给所述消息发送端。

本需求的另一目的在于提供一种即时通讯消息回执系统,所述系统包括 :

1.第一接收单元,用于接收包含消息回执参数以及消息正文的数据包 ;
解析单元,用于解析所述数据包,根据所述数据包中的消息回执参数确定消息发送端是否需要回执 ;

2.回执生成单元,用于在确定所述消息发送端需要回执时,获取对所述数据包的处理结果,并根据所述处理结果生成回执信息 ;

3.回执反馈单元,用于将所述回执生成单元生成的回执信息反馈给所述消息发送端。

从上述技术方案可以看出,能够实现即时通讯回执业务,在确定消息发送端需要回执时,获取对所述消息发送过程中的各个处理结果,并根据所述处理结果生成不同的回执信息,方便消息发送端及时、准确的掌握消息发送过程中的各种状态,利于其他相关业务的开展,极大的提高了用户满意度,具有较强的实用性。

附图说明

为了更清楚地说明本技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术方案的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图 1 提供的即时通讯消息回执方法的实现流程图 ;
图 2 提供的即时通讯消息回执方法的具体流程图 ;
图 3 提供的即时通讯消息回执系统的组成结构图。


2. 阅后即焚消息的即时通讯方法及装置

本技术方案公开了一种阅后即焚消息的即时通讯方法及装置,该方法包括:通讯发起方运行即时eSpace客户端,并向通讯接收方发送阅后即焚消息;即时eSpace客户端的服务器保存阅后即焚消息,建立包含阅后即焚消息的组件,生成指向组件的链接信息并将链接信息发送给通讯发起方;通讯发起方通过API将链接信息分享至通讯接收方;通讯接收方根据链接信息建立与服务器的通讯连接,并基于组件实现与通讯发起方的即时通讯,解决了不同eSpace客户端eSpace客户端之间无法实现阅后即焚消息即时通讯的技术问题,实现了通讯接收方无需安装与通讯发起方相同的eSpace客户端也能与通讯发起方进行阅后即焚消息的即时通讯,提升了用户进行阅后即焚消息即时通讯的体验。

背景技术

随着通信技术的发展,越来越多的用户通过工MeSpace客户端进行私密信息的传送,具体地,可以通过阅后即焚的应用实现。所谓阅后即焚信息是指:信息发送终端向信息接收终端发送携带“自动删除指令”信息,信息接收终端接收信息后在预设时间内显示或显示,并经过预先设定的时间间隔后自动删除该信息。现有实现阅后即焚消息的工MeSpace客户端种类主要有来往、易信等,采用来往、易信这类工MeSpace客户端可以实现文本、视频、音频等多种数据格式的阅后即焚消息的通讯,但要求通讯接收方安装有与通讯发起方相同的工MeSpace客户端才能实现阅后即焚消息的通讯。

技术方案内容

本技术方案提供了一种阅后即焚消息的即时通讯方法及装置,以解决不同eSpace客户端之间无法实现阅后即焚消息即时通讯的技术问题。

根据本技术方案的一方面,提供了一种阅后即焚消息的即时通讯方法,包括:
通讯发起方运行即时eSpace客户端,并向通讯接收方发送阅后即焚消息;即时eSpace客户端的服务器保存阅后即焚消息,建立包含阅后即焚消息的组件,生成指向组件的链接信息并将链接信息发送给通讯发起方;通讯发起方通过API将链接信息分享至通讯接收方;通讯接收方根据链接信息建立与服务器的通讯连接,并基于组件实现与通讯发起方的即时通讯。

进一步地,建立包含阅后即焚消息的组件包括:服务器判断阅后即焚消息中是否包含请求与通讯接收方交互的交互请求指令,若是,则生成用于显示阅后即焚消息和进行交互通讯的组件;若否,则仅生成用于显示阅后即焚
消息的组件。

进一步地,通讯接收方根据链接信息建立与服务器的通讯连接包括:
服务器监听是否有对链接信息的访问请求,若是,则建立与访问链接信息的访问端的通讯连接,并将保存的阅后即焚消息填充至组件,若否,则继续等待对链接信息的访问请求。

进一步地,服务器监听到有对链接信息的访问请求时,还包括:
随机分配临时工号码或选择通讯发起方提供给服务器的通讯接收方的即时通讯工号作为临时工号码,临时工号码用于与通讯发起方进行通讯。
进一步地,链接信息包括:

组件链接地址、访问提示信息、下载应用和注册账户提示信息;其中,组件链接地址用于访问登录和加载组件,访问提示信息用于提示通讯接收方访问组件链接地址,下载应用和注册账户提示信息用于引导通讯接收方对即时eSpace客户端进行下载和账户注册。

根据本技术方案的另一方面,提供了一种阅后即焚消息的即时通讯装置,包括:通讯发起方终端、服务端、通讯接收方终端;其中,通讯发起方终端,用于通讯发起方运行即时eSpace客户端,并向通讯接收方发送阅后即焚消息,以及将服务端生成的链接信息通过AP工分享至通讯接收方;服务端,用于保存阅后即焚消息,建立包含阅后即焚消息的组件,生成指向组件的链接信息并将链接信息发送给通讯发起方;通讯接收方终端,用于根据链接信息建立与服务器的通讯连接,并基于组件实现与通讯发起方的即时通讯。

进一步地,服务端还包括:监听模块,用于监听是否有对链接信息的访问请求,若是,则建立与访问链接信息的访问端的通讯连接,并将保存的阅后即焚消息填充至组件,若否,则继续等待对链接信息的访问请求。

附图说明

构成本申请的一部分的附图用来提供对本技术方案的进一步理解,本技术方案的示意性实施例及其说明用于解释本技术方案,并不构成对本技术方案的不当限定。在附图中:
图1是本技术方案优选实施例的阅后即焚消息的即时通讯方法流程图;

图2是本技术方案优选实施例的阅后即焚消息的即时通讯装置结构示意图。

###核心代码
那么根据整个功能流程,首先,我们要对消息model进行一下改造,增加一个状态位的属性toReadState,来区分消息是否被对方读了;还需要增加一个属性toReadMessageId,这个属性主要用在“回执”当中,用来告诉对方,我读了你的哪条消息,以便对方标注。

public int toReadStatus;

public String toReadMessageId;

这样改造过后,如果消息带有toReadMessageId,那么它就不是一条消息,而是一条“回执”,而“回执”是不需要显示在会话列表或聊天面板中的,因此,我们需要在接收消息的时候判断一下,如果是“回执”,则不显示也不存储到数据库中。

/**
     * 批量发送回执给对方并更新界面和数据库
     * @param firstVisibleItem 屏幕中第一条可见消息
     */
    private void sendToReadMessage(int firstVisibleItem) {
        if (messageInfos != null && messageInfos.size() != 0) {
            
            SQLiteDatabase db = DBHelper.getInstance(mContext).getReadableDatabase();
            MessageTable messageTable = new MessageTable(db);
            for (int i = firstVisibleItem; i < messageInfos.size(); i++) {

                MessageInfo messageInfo = messageInfos.get(i);
                // 状态位为0,并且不能是自己发的消息
                if (messageInfo.toReadState == 0 && !messageInfo.fromid.equals(ResearchCommon.getUserId(mContext))) {

                    messageInfo.toReadState = 1;
                                   //发送回执
                    sendReadState(messageInfo.id);
                                   //保存到数据库中
                    messageTable.update(messageInfo);
                                   //更新显示
                    mAdapter.notifyDataSetChanged();
                }
            }
        }
    }
/**
     * 发送回执给对方
     * @param id 已读的MessageId
     */
    private void sendReadStatus(String id) {
        send();

        MessageInfo msg = new MessageInfo();
        msg.fromid = ResearchCommon.getUserId(mContext);
        msg.tag = UUID.randomUUID().toString();
        msg.fromname = mLogin.nickname;
        msg.fromurl = mLogin.headsmall;
        msg.toid = fCustomerVo.uid;
        msg.toname = getFromName();
        msg.tourl = fCustomerVo.headsmall;
        msg.typefile = MessageType.TEXT;
        msg.content = "";
        msg.typechat = mType;
        msg.time = System.currentTimeMillis();
        msg.readState = 1;
                //告诉对方已读哪条信息
               msg.toReadMessageId = id;
        sendBroad2Save(msg, false, true);

    }
// 接受消息
    private void notifyMessage(final MessageInfo msg) {
        if (msg == null) {
            return;
        }
        handler.post(new Runnable() {

            @Override
            public void run() {
                try {
                    // 当该信息不来自好友就过滤掉!
                    if (msg.getFromId().equals(ResearchCommon.getUserId(mContext))) {
                        return;
                    }
                    //如果不是回执
                    if (msg.toReadMessageId.equals("-1")) {
                        messageInfos.add(msg);
                        //更新头像
                        updateUserHead(msg);

                        mAdapter.notifyDataSetInvalidated();
                        if (messageInfos.size() == 1
                                || (mListView.getLastVisiblePosition() == messageInfos.size() - 2)) {
                            mListView.setSelection(messageInfos.size() - 1);
                        }
                                                //发送已读回执
                        sendReadStatus(msg.id);
                        startDeleteTimer(msg);

                    } else {
                                                //如果是回执的话就根据id更新已读状态
                        updateReadState(msg.toReadMessageId);

                    }
                } catch (Exception e) {

                }

            }
        });
    }
private void updateReadState(String id) {
        if (mType == GlobleType.SINGLE_CHAT) {
            for (int i = 0; i < messageInfos.size(); i++) {
                final MessageInfo messageInfo = messageInfos.get(i);
                if (id.equals(messageInfo.id)) {

                    messageInfo.toReadStatus = 1;

                    SQLiteDatabase db = DBHelper.getInstance(mContext).getReadableDatabase();
                    MessageTable messageTable = new MessageTable(db);
                    messageTable.update(messageInfo);

                    mAdapter.notifyDataSetInvalidated();
                    startDeleteTimer(messageInfo);
                }
            }
        }

    }

发表评论