優悅家裝發送消息流程

這裏寫圖片描述

發送文本消息

點擊按鈕 —> 構造文本消息對象—> 設置@的人員 —> base64編碼—> 保存消息到本地數據庫—> 發送消息—>發送完畢後修改消息發送狀態
點擊發送按鈕後,頁面(ChatFragment.java)響應發送事件

// 發送按鈕點擊事件
ekBar.getBtnSend().setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String text = ekBar.getEtChat().getText().toString();
        if (!TextUtils.isEmpty(text)) {
            onSendBtnClick(text);   //發送
            ekBar.getEtChat().setText("");
        }
    }
});

/**
 * 當點擊了發送按鈕,發送文本消息
 * @param sendText
 */
private void onSendBtnClick(String sendText) {
    if (TextUtils.isEmpty(sendText) || TextUtils.isEmpty(sendText.trim())) {
        return;
    }
    long groupId = mGroupBean.getGroupId();
    long userId = AuthManager.getUid(getContext());
    String nickname = AuthManager.getName(getContext());
    String avatar = AuthManager.getAvatar(getContext());
    QXGroupTextMessage qxMessage = QXMessageCreator.createQXGroupTextMessage(groupId, userId, nickname, avatar, sendText, mGroupBean.getGroupType());
    //設置@了哪些人
    if(atUserInfoList != null){
        List<String> asList = new ArrayList<>();
        for(AtUserInfo userInfo : atUserInfoList){
            asList.add(userInfo.getUserId());
        }
        qxMessage.setAtList(asList);
    }
    sendQXGroupMessage(qxMessage);//發送消息
    ChatBean chatBean = new ChatBean(qxMessage);
    chatBean.setSendStatus(ChatBean.SEND_STATUS_PROCESS);
    dataList.add(chatBean);
    //Utils.hideSoftInput(mActivity);
}

private void sendQXGroupMessage(QXGroupMessage message) {
try {
    QXIMClient.sendMessage(message);
    //給首頁->企信界面發送事件,讓其更新其界面
    MessageSendEvent messageSendEvent = new MessageSendEvent(MessageSendEvent.SEND_MESSAGE_PROCESS, projectId, message.toDisplayMessage());
    RxBus.get().post(messageSendEvent);
} catch (Exception e) {
    e.printStackTrace();
    if (BuildConfig.LOG_DEBUG) {
        Log.w(TAG, "call sendMessage but send fail : " + e);
    }
}
}

最後會調用如下代碼發送消息,如下所示,先設置一個唯一的ID(clientMessageId),以便區分消息。將消息加入到發送消息的集合(processGroupMessageList)中,當消息發送成功\失敗後,再從集合中移除。
如果是文本消息,需要先進行base64編碼。

private void sendMessage(QXGroupMessage qxmsg, boolean isFirstSend){
    Log.v("sendMessage : "+qxmsg);
    if(qxmsg == null){
        return;
    }
    //如果clientMessageId等於空,代表是不是重發消息,是第一次發送消息
    if(qxmsg.getClientMessageId() == null || "".equals(qxmsg.getClientMessageId())){
        String uuid = UUID.randomUUID().toString();
        qxmsg.setClientMessageId(uuid);
        sendQXMessageToByStoreHandler(qxmsg, WHAT_MESSAGE_SEND);
    }else{
        qxmsg.setSendTime(System.currentTimeMillis());
    }
    if(isFirstSend){
        if(!processGroupMessageList.contains(qxmsg)){
            processGroupMessageList.add(qxmsg);
        }
    }
    //如果需要base64編碼
    if(isNeedBase64Encode){
        if(qxmsg instanceof QXGroupTextMessage){//只有文本消息才需要base64編碼
            QXGroupTextMessage groupTextMessage = (QXGroupTextMessage)qxmsg;
            String data = groupTextMessage.getData();
            String base64 = Base64.encodeToString(data.getBytes(), Base64.NO_WRAP);
            QXGroupTextMessage message= QXMessageCreator.createQXGroupTextMessage(groupTextMessage.getGroupId(), groupTextMessage.getUserId(), groupTextMessage.getName(), null, base64, groupTextMessage.getGroupType());
            message.setId(groupTextMessage.getId());
            message.setClientMessageId(groupTextMessage.getClientMessageId());
            message.setAtList(groupTextMessage.getAtList());
            sendMessage(message.toTransactString());
        }else{
            sendMessage(qxmsg.toTransactString());
        }
    }else{
        sendMessage(qxmsg.toTransactString());
    }
}

發送圖片消息

發送圖片有兩種方式,一種是從相冊選擇圖片,另一種是拍照。

選擇圖片 —> 壓縮圖片—> 上傳圖片—> 構造圖片消息對象 —>保存消息到本地數據庫—> 發送消息—>發送完畢後修改消息發送狀態

發送圖片的邏輯是先將圖片壓縮,然後上傳圖片到服務器,然後發送圖片消息,代碼如下:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.v("requestCode " + requestCode + ", resultCode = " + resultCode);
    if (resultCode == RESULT_OK) {
        if (requestCode == CAMERA_REQUEST) {
            if (mCameraFile != null && mCameraFile.exists()) {
                //拍照後回調
                cameraPictureActivityResult(mCameraFile.getPath());
            }
        } else if (requestCode == IMAGE_REQUEST) {
            List<String> paths = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
            if (paths != null && paths.size() > 0) {
                //從相處選擇後回調
                imagesSelectActivityResult(paths);
            }
        } else if (requestCode == LOCATION_REQUEST) {
            if (data != null) {
                double lat = data.getDoubleExtra("latitude", 0.0);
                double lot = data.getDoubleExtra("longitude", 0.0);
                String address = data.getStringExtra("address");
                String imagePath = data.getStringExtra("imagepath");
                scrollToBottom();
                locationActivityResult(lat, lot, address, imagePath);
                Log.v("位置:" + address + ":" + lat + ":" + lot + ":" + imagePath);
            }
        } else if (requestCode == FilePickerConst.REQUEST_CODE_DOC) {
            if (data != null) {
                ArrayList<String> documentPaths = data.getStringArrayListExtra(FilePickerConst.KEY_SELECTED_DOCS);
                documentActivityResult(documentPaths);
            }
        }
    }
}

/**
     * 圖片選擇後添加圖片路徑
     * @param paths
     */
    private void imagesSelectActivityResult(List<String> paths) {
        Log.v(TAG, "imagesSelectActivityResult : " + paths);
        //Toaster.showShort(mContext, "imagesSelectActivityResult : " + paths);
        uploadSendImageMessage(paths);
    }

    /**
     * 上傳並且發送圖片消息(先壓縮圖片,然後上次壓縮圖片到服務器,拿到服務器返回的圖片url,在發送這個url。其他設備獲取到url後就可以顯示圖片了)
     * @param imagePaths(圖片路徑集合)
     */
    private void uploadSendImageMessage(List<String> imagePaths) {
        Log.v(TAG, "uploadSendImageMessage : " + imagePaths);
        //Toaster.showShort(mContext, "sendImageMessage : " + imagePaths);
        //step 1, 在界面上顯示圖片消息
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        List<ChatBean> uploadImageList = new ArrayList<>();
        for (String string : imagePaths) {
            QXGroupImageMessage message = new QXGroupImageMessage();
            message.setGroupId(mGroupBean.getGroupId());
            message.setSendTime(System.currentTimeMillis());
            message.setGroupName(mGroupBean.getGroupName());
            //message.setGroupType();
            message.setUserId(AuthManager.getUid(mContext));
            message.setName(AuthManager.getName(mContext));
            message.setAvatar(AuthManager.getAvatar(mContext));
            message.setLocalPath(string);
            BitmapFactory.decodeFile(string, options);
            message.setWidth(options.outWidth);
            message.setHeight(options.outHeight);
            ChatBean chatBean = new ChatBean(message);
            chatBean.setShowProcess(true);
            chatBean.setPosition(dataList.size());
            dataList.add(chatBean);
            uploadImageList.add(chatBean);
        }
        //step 2, 上傳併發送圖片消息
        sendImageMessage(uploadImageList);
    }

發送語音消息

流程 錄音—>上傳錄音文件 —>保存消息到本地數據庫—> 發送消息—>發送完畢後修改消息發送狀態

/**
 * 按住按鈕說話邏輯處理
 * @param event
 * @return
 */
@OnTouch(R.id.btn_voice)
boolean onVoiceBtnTouch(MotionEvent event){
    Log.v(TAG, "call onVoiceBtnTouch " +event);
    int action = event.getAction();
    int x = (int) event.getX();
    int y = (int) event.getY();
    switch (action)
    {
        case MotionEvent.ACTION_DOWN:
            .......
            //發送語音消息
            final ChatBean chatBean = new ChatBean(message);
            chatBean.setSendStatus(ChatBean.SEND_STATUS_PROCESS);
            message.setLocalUrl(fileName);
            sendVoiceMessage(chatBean, true);
            .......
            break;
        case MotionEvent.ACTION_MOVE:
            ......
            break;
        case MotionEvent.ACTION_UP:
            ......
            break;
    }
    return false;
}

發送文件消息

流程 選擇文件 —> 上傳文件—> 構造文件消息對象 —>保存消息到本地數據庫—> 發送消息—>發送完畢後修改消息發送狀態

/**
     * 選擇文檔後的處理,發送文檔消息(先上傳文件到服務器,拿到url然後上傳)
     * @param documentPaths
     */
    private void documentActivityResult(ArrayList<String> documentPaths) {
        if (BuildConfig.LOG_DEBUG) {
            Log.v(TAG, "documentActivityResult : " + documentPaths);
            //Toaster.showShort(mContext, "documentActivityResult : " + documentPaths);
        }
        //step 1, 在界面上顯示文檔消息
        File file = null;
        List<ChatBean> uploadDocList = new ArrayList<>();
        for (String string : documentPaths) {
            file = new File(string);
            QXGroupDocumentMessage message = new QXGroupDocumentMessage();
            message.setGroupId(mGroupBean.getGroupId());
            message.setSendTime(System.currentTimeMillis());
            message.setLocalPath(string);
            message.setGroupName(mGroupBean.getGroupName());
            //message.setGroupType();
            message.setUserId(AuthManager.getUid(mContext));
            message.setName(AuthManager.getName(mContext));
            message.setAvatar(AuthManager.getAvatar(mContext));
            message.setFileName(file.getName());
            try {
                message.setSize(Utils.getFileSizes(file));
            } catch (Exception e) {
                e.printStackTrace();
            }
            ChatBean chatBean = new ChatBean(message);
            chatBean.setShowProcess(true);
            chatBean.setPosition(dataList.size());
            dataList.add(chatBean);
            uploadDocList.add(chatBean);
        }
        mChatAdapter.notifyDataSetChanged();
        scrollToBottom();
        //step 2, 上傳併發送文檔消息
        sendDocumentMessage(uploadDocList);
    }

發送位置消息

流程 定位—> 構造位置消息 —>保存消息到本地數據庫—> 發送消息—>發送完畢後修改消息發送狀態

/**
     * 地圖地位後的方法處理,發送經緯度,地址信息
     * @param latitude
     * @param longitude
     * @param address
     * @param imagePath
     */
    private void locationActivityResult(double latitude, double longitude, String address, String imagePath) {
        if (BuildConfig.LOG_DEBUG) {
            Log.v(TAG, "locationActivityResult : " + latitude + ", " + longitude + "," + address);
        }
        //Toaster.showShort(mContext, "locationActivityResult : "+imagePath);
        //step 1,  發送定位消息
        long groupId = mGroupBean.getGroupId();
        long userId = AuthManager.getUid(getContext());
        String nickname = AuthManager.getName(getContext());
        String avatar = AuthManager.getAvatar(getContext());
        QXGroupLocationMessage qxMessage = QXMessageCreator.createQXGroupLocationMessage(
                groupId, userId, nickname, avatar, latitude, longitude, address, mGroupBean.getGroupType());
        sendQXGroupMessage(qxMessage);
        //step 2, 更新界面
        ChatBean chatBean = new ChatBean(qxMessage);
        chatBean.setSendStatus(ChatBean.SEND_STATUS_PROCESS);
        dataList.add(chatBean);
        mChatAdapter.notifyDataSetChanged();
        scrollToBottom();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章