优悦家装发送消息流程
来源:互联网 发布:g92车多头螺纹编程 编辑:程序博客网 时间:2024/05/01 02:48
发送文本消息
点击按钮 —> 构造文本消息对象—> 设置@的人员 —> 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()); }}
发送图片消息
发送图片有两种方式,一种是从相册选择图片,另一种是拍照。
选择图片 —> 压缩图片—> 上传图片—> 构造图片消息对象 —>保存消息到本地数据库—> 发送消息—>发送完毕后修改消息发送状态
发送图片的逻辑是先将图片压缩,然后上传图片到服务器,然后发送图片消息,代码如下:
@Overridepublic 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(); }
阅读全文
0 0
- 优悦家装发送消息流程
- 流程发送消息机制
- activeMq发送消息流程
- Spark分布式消息发送流程
- kafka消息发送-消费流程
- mars C层消息发送流程
- handler looper 消息发送和消息处理流程
- Android Handler 实例化-->发送消息-->处理消息流程
- WebViewJavascriptBridge 分析oc向js发送消息处理流程
- 消息发送
- 发送消息
- 发送消息
- windows程序窗体创建流程模型A--发送自定义消息逻辑上出现Bug
- RCS-MSRP发送1:1(1对1)的消息流程
- Android Handler MessageQueue Loop Message之间的关系以及消息发送响应流程
- XMPP 发送消息,发送图片
- ios发送消息 注册消息
- Windows消息投递流程:WM_COMMAND消息流程
- selenium 时间日期控件的处理
- Quartz定时调度器
- Java适配器模式
- NKOJ-4189 信与信封的问题<反向建图>
- C# 截取字符串
- 优悦家装发送消息流程
- scanf和scanf_s
- 修复IE主页被篡改劫持的方法之一:自定义xxx.reg文件
- 一篇文全面解析Oracle死锁的分类及模拟
- 强大的PyTorch:10分钟让你了解深度学习领域新流行的框架
- 洛谷P3193 [HNOI2008]GT考试
- codeMB轮 送外卖
- ModbusRTU协议的Java Socket
- 数据结构面试整理(4)