我是靠谱客的博主 飘逸钢笔,这篇文章主要介绍Android实现聊天记录上传本地服务器(即时通讯),现在分享给大家,希望可以做个参考。

即时通讯功能,使用SDK里封装的方法,获取聊天记录,接口请求成功,但获取不到数据。使用本地的服务器保存聊天记录,实现方法如下:

1. ChatFragment.java中请求聊天记录:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
public class ChatFragment extends EaseChatFragment implements EaseChatFragmentHelper { @Override protected void setUpView() { setChatFragmentHelper(this); String userName = DemoHelper.getInstance().getCurrentUsernName(); conversation = EMClient.getInstance().chatManager().getConversation(toChatUsername, EaseCommonUtils.getConversationType(chatType), true); Log.e(TAG,"conversation.getAllMsgCount()="+conversation.getAllMsgCount()); if (conversation.getAllMsgCount() != 0 && conversation.getAllMsgCount() != 1) { setLisener(); } else { conversation.clearAllMessages(); conversation.clear(); showWaitDialog("数据加载中……").show(); getHistoryMsg(userName,toChatUsername); } } private void setLisener() { if (chatType == Constant.CHATTYPE_SINGLE) { Map<String, RobotUser> robotMap = DemoHelper.getInstance().getRobotList(); if(robotMap!=null && robotMap.containsKey(toChatUsername)){ isRobot = true; } } super.setUpView(); …… setOnRefresh1Listener(new OnRefresh1Listener() { @Override public boolean refresh(int page) { pageNo = page; getHistoryMsg(DemoHelper.getInstance().getCurrentUsernName(),toChatUsername); return false; } }); } List<EMMessage> emMessages = new ArrayList<>(); List<RemoteMessage> remoteMessages = new ArrayList<>(); int pageNo = 1; private void getHistoryMsg(String sendUser, String receiveUser) { HashMap<String, Object> baseParam = new HashMap<>(4); baseParam.put("pageNo",pageNo); baseParam.put("pageSize",10); if (chatType == EaseConstant.CHATTYPE_GROUP) { baseParam.put("sendUser",receiveUser); baseParam.put("receiveUser",receiveUser); } else { baseParam.put("sendUser",sendUser); baseParam.put("receiveUser",receiveUser); } OkHttpUtil.post(TAG, WebApi.MSN_CHAT_LIST, baseParam, new StringCallback() { @Override public void onError(Call call, Exception e, int id) { Log.e(TAG,"getHistoryMsg e="+ e); } @Override public void onResponse(String response, int id) { Log.e(TAG,"getHistoryMsg response="+ response); try { JSONObject object = new JSONObject(response); if (object.getInt("code") == 200) { JSONObject object1 = object.getJSONObject("data"); Gson gson = new Gson(); if (pageNo == 1) { remoteMessages.clear(); } ListPageBean listPageBean = gson.fromJson(object1.toString(),ListPageBean.class); if (listPageBean.isLastPage()) { isLastPage = true; } else { isLastPage = false; } JSONArray array = object1.getJSONArray("list"); for (int i = 0;i<array.length();i++) { RemoteMessage remoteMessage = gson.fromJson(array.get(i).toString(),RemoteMessage.class); convertMsg(remoteMessage); } Log.e(TAG,"emMessages.size()="+emMessages.size()); //下拉加载 if (emMessages.size()< 10) { haveMoreData = false; } else { haveMoreData = true; } importDataBase(emMessages); } } catch (JSONException e) { e.printStackTrace(); hideWaitDialog(); } } }); } /* * 将从接口获取的数据转换成EMMessage对象 * */ private void convertMsg(RemoteMessage remoteMessage) { EMMessage message = null; Log.e(TAG,"getHistoryMsg Message="+ remoteMessage.getMessage()+","+remoteMessage.getSendTime()+","+remoteMessage.getCreateDate()); if (remoteMessage.getMesType().equals("1")) { message = EMMessage.createTxtSendMessage(remoteMessage.getMessage(), remoteMessage.getReceiveUser()); } else if (remoteMessage.getMesType().equals("2")) { message = EMMessageUtils.createLocationMsg(remoteMessage); } else if (remoteMessage.getMesType().equals("3")) {//语音 message = createVoiceMsg(remoteMessage); } else if (remoteMessage.getMesType().equals("4")) {//视频 message = EMMessageUtils.createVideoMsg(remoteMessage); getFile(message,remoteMessage.getMesType(),remoteMessage.getFileUrl(),((EMVideoMessageBody)message.getBody()).getFileName()); } else if (remoteMessage.getMesType().equals("5")) {//图片 message = createImageMsg(remoteMessage); } else if (remoteMessage.getMesType().equals("6")) {//文件 message = createFileMsg(remoteMessage); } else if (remoteMessage.getMesType().equals("7")) {//语音 message = EMMessage.createTxtSendMessage(remoteMessage.getMessage(), remoteMessage.getReceiveUser()); message.setAttribute(Constant.MESSAGE_ATTR_IS_VOICE_CALL,true); } else if (remoteMessage.getMesType().equals("8")) {//视频电话 message = EMMessage.createTxtSendMessage(remoteMessage.getMessage(), remoteMessage.getReceiveUser()); message.setAttribute(Constant.MESSAGE_ATTR_IS_VIDEO_CALL,true); } else if (remoteMessage.getMesType().equals("9")) { message = EMMessage.createTxtSendMessage(remoteMessage.getMessage(), remoteMessage.getReceiveUser()); message.setAttribute("is_office",true); } if (remoteMessage.getSendUser().equals(DemoHelper.getInstance().getCurrentUsernName())) { message.setDirection(EMMessage.Direct.SEND); } else { message.setDirection(EMMessage.Direct.RECEIVE); } if (remoteMessage.getReceiveType().equals("0")) { message.setChatType(EMMessage.ChatType.Chat); } else { message.setChatType(EMMessage.ChatType.GroupChat); } // message.setChatType(EMMessage.ChatType.Chat); message.setFrom(remoteMessage.getSendUser()); message.setMsgId(remoteMessage.getMsgId()); message.setMsgTime(Long.valueOf(remoteMessage.getSendTime())); message.setStatus(EMMessage.Status.SUCCESS); conversation.insertMessage(message); // updateMsg(message); emMessages.add(message); } private EMMessage createFileMsg(RemoteMessage remoteMessage) { EMMessage message = null; String msgStr = remoteMessage.getMessage(); String[] msgArr = msgStr.split(","); String localurl=""; for (int j=0;j<msgArr.length;j++) { String[] lat = msgArr[j].split(":"); if (lat[0].contains("localUrl")) { localurl = lat[1].trim(); } } message = EMMessageUtils.createFileSendMessage(remoteMessage.getSendUser(),localurl, remoteMessage.getReceiveUser()); getFile(message,remoteMessage.getMesType(),remoteMessage.getFileUrl(),((EMFileMessageBody)message.getBody()).getFileName()); ((EMFileMessageBody)message.getBody()).setRemoteUrl(remoteMessage.getFileUrl()); return message; } private EMMessage createImageMsg(RemoteMessage remoteMessage) { EMMessage message = null; String msgStr = remoteMessage.getMessage(); String[] msgArr = msgStr.split(","); String localurl=""; for (int j=0;j<msgArr.length;j++) { String[] lat = msgArr[j].split(":"); if (lat[0].contains("localurl")) { localurl = lat[1].trim(); } } message = EMMessageUtils.createImageSendMessage(remoteMessage.getSendUser(),localurl, false, remoteMessage.getReceiveUser()); getFile(message,remoteMessage.getMesType(),remoteMessage.getFileUrl(),((EMImageMessageBody)message.getBody()).getFileName()); ((EMImageMessageBody)message.getBody()).setRemoteUrl(remoteMessage.getFileUrl()); return message; } private EMMessage createVoiceMsg(RemoteMessage remoteMessage) { EMMessage message = null; int size = 0; if (!StringUtils.isEmpty(remoteMessage.getSize())) { size = Integer.valueOf(remoteMessage.getSize()); } String msgStr = remoteMessage.getMessage(); String[] msgArr = msgStr.split(","); String localurl=""; for (int j=0;j<msgArr.length;j++) { String[] lat = msgArr[j].split(":"); if (lat[0].contains("localurl")) { localurl = lat[1].trim(); } } message = EMMessageUtils.createVoiceSendMessage(localurl, size, remoteMessage.getReceiveUser()); ((EMVoiceMessageBody)message.getBody()).setRemoteUrl(remoteMessage.getFileUrl()); getFile(message,remoteMessage.getMesType(),remoteMessage.getFileUrl(),((EMVoiceMessageBody)message.getBody()).getFileName()); return message; } /* * 下载文件 * */ HttpURLConnection con; private void downLoad(EMMessage emMessage,String type,String path, String fileName) { try { URL url = new URL(path); con = (HttpURLConnection) url.openConnection(); con.setReadTimeout(5000); con.setConnectTimeout(5000); con.setRequestProperty("Charset", "UTF-8"); con.setRequestMethod("GET"); if (con.getResponseCode() == 200) { InputStream is = con.getInputStream();//获取输入流 FileOutputStream fileOutputStream = null;//文件输出流 if (is != null) { String toUser = ""; if (emMessage.direct() == EMMessage.Direct.RECEIVE) { toUser = emMessage.getFrom(); } File file = FileLoadUtils.createFileEm(type,fileName,toUser); fileOutputStream = new FileOutputStream(file);//指定文件保存路径,代码看下一步 byte[] buf = new byte[1024]; int ch; while ((ch = is.read(buf)) != -1) { fileOutputStream.write(buf, 0, ch);//将获取到的流写入文件中 } } if (fileOutputStream != null) { fileOutputStream.flush(); fileOutputStream.close(); } if (type.equals("4")) { String thum = FileLoadUtils.getThumnailPath(emMessage.getFrom(),((EMVideoMessageBody)emMessage.getBody()).getLocalUrl()); Log.e(TAG,"downLoad thum="+thum); ((EMVideoMessageBody)emMessage.getBody()).setLocalThumb(thum); } Log.d(TAG,"下载成功"); // getActivity().runOnUiThread(new Runnable() { // @Override // public void run() { // Toast.makeText(getActivity(),"下载成功"+fileName,Toast.LENGTH_SHORT).show(); // } // }); } else { Log.d(TAG,"下载失败"); // getActivity().runOnUiThread(new Runnable() { // @Override // public void run() { // Toast.makeText(getActivity(),"下载失败",Toast.LENGTH_SHORT).show(); // } // }); } } catch (Exception e) { e.printStackTrace(); }finally { //最后将conn断开连接 if (con != null) { con.disconnect(); con = null; } } } private void getFile(EMMessage message,String type,String path, String fileName) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { downLoad(message,type,path,fileName); return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); Log.e(TAG,"getFile"+result); } }.execute(); } /* * 将数据导入数据库 * */ private void importDataBase(List<EMMessage> messages) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { EMClient.getInstance().chatManager().importMessages(emMessages); return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); handler.postDelayed(new Runnable() { @Override public void run() { setLisener(); hideWaitDialog(); } },3000); Log.e(TAG,"importMessages"+result); } }.execute(); } /* * 附加功能,语音电话和视频电话 * 增加了发送企业名片的功能 * */ @Override protected void registerExtendMenuItem() { //use the menu in base class super.registerExtendMenuItem(); //extend menu items inputMenu.registerExtendMenuItem(R.string.attach_video, R.drawable.em_chat_video_selector, ITEM_VIDEO, extendMenuItemClickListener); inputMenu.registerExtendMenuItem(R.string.attach_file, R.drawable.em_chat_file_selector, ITEM_FILE, extendMenuItemClickListener); if(chatType == Constant.CHATTYPE_SINGLE){ inputMenu.registerExtendMenuItem(R.string.attach_voice_call, R.drawable.em_chat_voice_call_selector, ITEM_VOICE_CALL, extendMenuItemClickListener); inputMenu.registerExtendMenuItem(R.string.attach_video_call, R.drawable.em_chat_video_call_selector, ITEM_VIDEO_CALL, extendMenuItemClickListener); inputMenu.registerExtendMenuItem("企业名片", R.drawable.em_chat_video_call_selector, ITEM_OFFICE_CARD, extendMenuItemClickListener); } else if (chatType == Constant.CHATTYPE_GROUP) { // 音视频会议 inputMenu.registerExtendMenuItem(R.string.voice_and_video_conference, R.drawable.em_chat_video_call_selector, ITEM_CONFERENCE_CALL, extendMenuItemClickListener); // inputMenu.registerExtendMenuItem(R.string.title_live, R.drawable.em_chat_video_call_selector, ITEM_LIVE, extendMenuItemClickListener); } } /* * 点击附加功能 * * */ @Override public boolean onExtendMenuItemClick(int itemId, View view) { switch (itemId) { case ITEM_VIDEO: Log.e(TAG,"onExtendMenuItemClick ITEM_VIDEO"); Intent intent = new Intent(getActivity(), ImageGridActivity.class); startActivityForResult(intent, REQUEST_CODE_SELECT_VIDEO); break; …… case ITEM_OFFICE_CARD: Log.e(TAG,"onExtendMenuItemClick ITEM_OFFICE_CARD"); startOfficeCard(); break; default: break; } //keep exist extend menu return false; } /* * 获取企业详情 * 增加了发送企业名片的功能 * */ private void startOfficeCard() { HashMap<String, Object> baseParam = WebFrontUtil.getBaseParam(); baseParam.put("id", SavePreferences.getString(Const.OFFICE_ID)); OkHttpUtil.post(TAG, WebApi.PUNISH_OFFICE_DETAIL, baseParam, new StringCallback() { @Override public void onError(Call call, Exception e, int id) { Log.e(TAG,"startOfficeCard e="+e); } @Override public void onResponse(String response, int id) { Log.e(TAG,"startOfficeCard response="+response); try { JSONObject object = new JSONObject(response); Gson gson = new Gson(); if ((int)object.get("code") == 200) { JSONObject object1 = object.getJSONObject("data"); OfficeBean officeBean = gson.fromJson(object1.toString(),OfficeBean.class); String content = "officeId:"+officeBean.getId()+",公司名称:"+officeBean.getName()+",地址:"+officeBean.getAddr()+",联系电话:"+officeBean.getOfficeTel(); EMMessage message = EMMessage.createTxtSendMessage(content, toChatUsername); message.setAttribute("is_office",true); sendMessage(message); } } catch (JSONException e) { e.printStackTrace(); } } }); } /** * chat row provider * 发送企业名片时,修改过此处,否则还是文本格式 * */ private final class CustomChatRowProvider implements EaseCustomChatRowProvider { @Override public int getCustomChatRowTypeCount() { //here the number is the message type in EMMessage::Type //which is used to count the number of different chat row return 14; } @Override public int getCustomChatRowType(EMMessage message) { if(message.getType() == EMMessage.Type.TXT){ //voice call if (message.getBooleanAttribute(Constant.MESSAGE_ATTR_IS_VOICE_CALL, false)){ return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_VOICE_CALL : MESSAGE_TYPE_SENT_VOICE_CALL; }else if (message.getBooleanAttribute(Constant.MESSAGE_ATTR_IS_VIDEO_CALL, false)){ //video call return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_VIDEO_CALL : MESSAGE_TYPE_SENT_VIDEO_CALL; } //messagee recall else if(message.getBooleanAttribute(Constant.MESSAGE_TYPE_RECALL, false)){ return MESSAGE_TYPE_RECALL; } else if (!"".equals(message.getStringAttribute(Constant.MSG_ATTR_CONF_ID,""))) { return MESSAGE_TYPE_CONFERENCE_INVITE; } else if (Constant.OP_INVITE.equals(message.getStringAttribute(Constant.EM_CONFERENCE_OP, ""))) { return MESSAGE_TYPE_LIVE_INVITE; }else if (message.getBooleanAttribute("is_office",false)) { return message.direct() == EMMessage.Direct.RECEIVE? MESSAGE_TYPE_RECV_CARD: MESSAGE_TYPE_SEND_CARD; } } return 0; } @Override @Override public EaseChatRowPresenter getCustomChatRow(EMMessage message, int position, BaseAdapter adapter) { if(message.getType() == EMMessage.Type.TXT){ // voice call or video call if (message.getBooleanAttribute(Constant.MESSAGE_ATTR_IS_VOICE_CALL, false) || message.getBooleanAttribute(Constant.MESSAGE_ATTR_IS_VIDEO_CALL, false)){ EaseChatRowPresenter presenter = new EaseChatVoiceCallPresenter(); return presenter; } if (message.getBooleanAttribute("is_office",false)) { Log.e(TAG,"getCustomChatRow is_office"); EaseChatRowPresenter presenter = new EaseChatCardPresenter(); return presenter; } //recall message else if(message.getBooleanAttribute(Constant.MESSAGE_TYPE_RECALL, false)){ EaseChatRowPresenter presenter = new EaseChatRecallPresenter(); return presenter; } else if (!"".equals(message.getStringAttribute(Constant.MSG_ATTR_CONF_ID,""))) { return new ChatRowConferenceInvitePresenter(); } else if (Constant.OP_INVITE.equals(message.getStringAttribute(Constant.EM_CONFERENCE_OP, ""))) { return new ChatRowLivePresenter(); } } return null; } } private Dialog mWaitDialog; public Dialog showWaitDialog(String text) { if (mWaitDialog == null) { mWaitDialog = DialogManager.getWaitDialog(getActivity(), text); } if (mWaitDialog != null) { TextView textView = mWaitDialog.findViewById(R.id.tv_message); textView.setText(text); mWaitDialog.show(); } return mWaitDialog; } public void hideWaitDialog() { try { if (mWaitDialog != null) { mWaitDialog.dismiss(); } mWaitDialog = null; } catch (Exception ex) { ex.printStackTrace(); } } }

2. EaseChatFragment.java: 发送消息,加载更多,定义了发送接口,以便activity页面调用;

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
public class EaseChatFragment extends EaseBaseFragment implements EMMessageListener { …… …… protected void setRefreshLayoutListener() { swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { handler.postDelayed(new Runnable() { @Override public void run() { if (!isRoaming) { loadMoreLocalMessage(); } else { loadMoreRoamingMessages(); } } }, 600); } }); } /** * 加载更多,haveMoreData的变化 */ private void loadMoreLocalMessage() { Log.e(TAG,"loadMoreLocalMessage isloading="+isloading+",haveMoreData="+haveMoreData+","+listView.getFirstVisiblePosition()); if (listView.getFirstVisiblePosition() == 0 && !isloading && haveMoreData) { List<EMMessage> messages; try { messages = conversation.loadMoreMsgFromDB(conversation.getAllMessages().size() == 0 ? "" : conversation.getAllMessages().get(0).getMsgId(), pagesize); } catch (Exception e1) { swipeRefreshLayout.setRefreshing(false); return; } if (messages.size() > 0) { messageList.refreshSeekTo(messages.size() - 1); if (messages.size() != pagesize) { haveMoreData = false; } } else { haveMoreData = false; if (onRefreshListener != null) { int size = conversation.getAllMessages().size(); Log.e(TAG,"size="+size); int pageNo = size/10+1; onRefreshListener.refresh(pageNo); } } isloading = false; } else { Toast.makeText(getActivity(), getResources().getString(R.string.no_more_messages), Toast.LENGTH_SHORT).show(); } swipeRefreshLayout.setRefreshing(false); } …… /** * 发送消息,并调用向本地服务器发送消息的接口 */ protected void sendMessage(EMMessage message){ if (message == null) { return; } Log.e(TAG,"sendMessage username="+message.getUserName()+",to="+message.getTo()+",from="+message.getFrom() +",status="+message.status()+",direct="+message.direct()+",keySet="+message.ext().keySet() +",type="+message.getType()+",MsgId="+message.getMsgId() +",body="+message.getBody().toString()); 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); } message.setMessageStatusCallback(messageStatusCallback); // Send message. EMClient.getInstance().chatManager().sendMessage(message); //调用向本地服务器发送消息的接口 if (onClickSendListener != null) { onClickSendListener.onSendClick(message); } //refresh ui if(isMessageListInited) { messageList.refreshSelectLast(); } } /** * 向本地服务器发送消息,需要在ChatActivity中调用 */ public OnClickSendListener onClickSendListener; public void setOnItemClickListener(OnClickSendListener onClickBottomListener) { this.onClickSendListener = onClickBottomListener; } public interface OnClickSendListener{ /** * 发送消息事件 */ public void onSendClick(EMMessage message); } /** * 下拉加载,在ChatFragment中调用 */ public OnRefresh1Listener onRefreshListener; public void setOnRefresh1Listener(OnRefresh1Listener onClickBottomListener) { this.onRefreshListener = onClickBottomListener; } public interface OnRefresh1Listener{ /** * 下拉加载事件 */ public boolean refresh(int page); }

3. ChatActivity.java:调用fragment的发送接口,以向本地服务器发送消息;

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
public class ChatActivity extends BaseActivity{ …… @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.em_activity_chat); activityInstance = this; //get user id or group id toChatUsername = getIntent().getExtras().getString("userId"); //use EaseChatFratFragment chatFragment = new ChatFragment(); //pass parameters to chat fragment chatFragment.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction().add(R.id.container, chatFragment).commit(); chatFragment.setOnItemClickListener(new EaseChatFragment.OnClickSendListener() { @Override public void onSendClick(EMMessage message) { sendRemoteMsg(message); } }); } …… private void sendRemoteMsg(EMMessage message) { Map<String, String> baseParam = new HashMap<>(); baseParam.put("id",""); baseParam.put("msgId",message.getMsgId()); baseParam.put("sendUser",message.getFrom()); baseParam.put("receiveUser",message.getTo()); Log.e(TAG,"receiveType="+message.getChatType().name()); String chatType =""; if (message.getChatType() == EMMessage.ChatType.Chat) { chatType = "0"; } else { chatType = "1"; } baseParam.put("receiveType",chatType); int type = 1; File file = null,file1 = null; int size = 0; Log.e(TAG,"type="+message.getType().name()); if (message.getType().name().toString().equals("TXT")) { if (message.getBooleanAttribute("is_office",false)) { type = 9; } else { type = 1; } EMTextMessageBody emTextMessageBody = ((EMTextMessageBody) message.getBody()); baseParam.put("message",emTextMessageBody.getMessage()); } else if (message.getType().name().toString().equals("LOCATION")) { type = 2; baseParam.put("message",message.getBody().toString()); } else if (message.getType().name().toString().equals("VOICE")) { type = 3; EMVoiceMessageBody emVoiceMessageBody = ((EMVoiceMessageBody) message.getBody()); String filePath = emVoiceMessageBody.getLocalUrl(); file = new File(filePath); baseParam.put("size",emVoiceMessageBody.getLength()+""); baseParam.put("message",message.getBody().toString()); } else if (message.getType().name().toString().equals("VIDEO")) { type = 4; EMVideoMessageBody emVideoMessageBody = ((EMVideoMessageBody) message.getBody()); String filePath = emVideoMessageBody.getLocalUrl(); file = new File(filePath); baseParam.put("size",emVideoMessageBody.getDuration()+""); String thumbnail = emVideoMessageBody.getLocalThumb(); Log.e(TAG,"thumbnail="+thumbnail+","+emVideoMessageBody.getLocalThumb()+",size="+emVideoMessageBody.getDuration()+","+emVideoMessageBody.getVideoFileLength()); file1 = new File(thumbnail); baseParam.put("message",message.getBody().toString()); } else if(message.getType().name().toString().equals("IMAGE")) { type = 5; String filePath = ((EMImageMessageBody) message.getBody()).getLocalUrl(); file = new File(filePath); baseParam.put("message",message.getBody().toString()); } else if (message.getType().name().toString().equals("FILE")) { type = 6; String filePath = ((EMFileMessageBody) message.getBody()).getLocalUrl(); file = new File(filePath); baseParam.put("message",message.getBody().toString()); } else { type = 1; baseParam.put("message",message.getBody().toString()); } baseParam.put("mesType",String.valueOf(type)); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); baseParam.put("sendTime",format.format(new Date(message.getMsgTime()))); Log.e(TAG,"baseParam="+ baseParam); FileLoadUtils.postFile(WebApi.MSN_CHAT_SAVE, baseParam, "mesFile", file,"thuFile",file1, new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG,"sendRemoteMsg e="+ e); } @Override public void onResponse(Call call, Response response) throws IOException { String result = FileLoadUtils.getResponseBody(response); Log.e(TAG,"sendRemoteMsg response="+ result+","+response); } }); } }

4. EMMessageUtils.java: ChatFragment.java中获取聊天记录后,将各种类型的聊天记录转化成相应的格式:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
public class EMMessageUtils { private static final String TAG = "EMMessageUtils"; public static EMMessage createImageSendMessage(String fromUser, String var0, boolean var1, String var2) { File file = new File(var0); String path = ""; if (!file.exists()) { String fileName = file.getName(); path = FileLoadUtils.BASE_PATH + fromUser + "/image/"+fileName; file = new File(path); } else { path = var0; } EMMessage var3 = EMMessage.createSendMessage(EMMessage.Type.IMAGE); var3.setTo(var2); EMImageMessageBody var4 = new EMImageMessageBody(file); var4.setSendOriginalImage(var1); var3.addBody(var4); return var3; } public static EMMessage createVoiceSendMessage(String var0, int var1, String var2) { File file = new File(var0); File pathFile = new File(file.getParent()); if (!pathFile.exists()) { pathFile.mkdirs(); } if (!file.exists()) { try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } EMMessage var3 = EMMessage.createSendMessage(EMMessage.Type.VOICE); EMVoiceMessageBody var4 = new EMVoiceMessageBody(file, var1); var3.addBody(var4); var3.setTo(var2); return var3; // } } public static EMMessage createVideoSendMessage(String fromUser,String var0, String var1, int var2, String var3) { File file = new File(var0); String path = ""; if (!file.exists()) { String fileName = file.getName(); path = FileLoadUtils.BASE_PATH + fromUser + "/video/"+fileName; file = new File(path); } else { path = var0; } Log.e(TAG,"createVideoSendMessage path="+path); EMMessage var5 = EMMessage.createSendMessage(EMMessage.Type.VIDEO); var5.setTo(var3); EMVideoMessageBody var6 = new EMVideoMessageBody(path, var1, var2, file.length()); var5.addBody(var6); return var5; } /* * 修改SDK中的创建文件类型的消息,改成使用自己的路径 * */ public static EMMessage createFileSendMessage(String fromUser,String var0, String var1) { File file = new File(var0); Log.e(TAG,"createFileSendMessage var0="+var0); String path = ""; if (!file.exists()) { String fileName = file.getName(); path = FileLoadUtils.BASE_PATH + fromUser + "/file/"+fileName; file = new File(path); } else { path = var0; } EMMessage var3 = EMMessage.createSendMessage(EMMessage.Type.FILE); var3.setTo(var1); EMNormalFileMessageBody var4 = new EMNormalFileMessageBody(file); var3.addBody(var4); return var3; } /* * 创建视频类型的消息 * */ public static EMMessage createVideoMsg(RemoteMessage remoteMessage) { EMMessage message = null; int size = 0; if (!StringUtils.isEmpty(remoteMessage.getSize())) { size = Integer.valueOf(remoteMessage.getSize()); } String msgStr = remoteMessage.getMessage(); String[] msgArr = msgStr.split(","); String localurl=""; String thumbnailUrl= ""; for (int j=0;j<msgArr.length;j++) { String[] lat = msgArr[j].split(":"); if (lat[0].contains("localUrl")) { localurl = lat[1].trim(); } else if (lat[0].equals("thumbnailUrl")) { if (lat.length>1) { thumbnailUrl = lat[1].trim(); } } } message = createVideoSendMessage(remoteMessage.getSendUser(),localurl, remoteMessage.getThuImg(), size, remoteMessage.getReceiveUser()); ((EMVideoMessageBody)message.getBody()).setRemoteUrl(remoteMessage.getFileUrl()); return message; } /* * 创建地址类型的消息 * */ public static EMMessage createLocationMsg(RemoteMessage remoteMessage) { EMMessage message = null; String locStr = remoteMessage.getMessage(); String[] locArr = locStr.split(","); double latitude=0,longitude=0; String locationAddress=""; for (int j=0;j<locArr.length;j++) { String[] lat = locArr[j].split(":"); if (lat[0].equals("location")) { locationAddress = lat[1]; } else if (lat[0].equals("lat")) { latitude = Double.valueOf(lat[1]); } else if (lat[0].equals("lng")) { longitude = Double.valueOf(lat[1]); } } message = EMMessage.createLocationSendMessage(latitude, longitude, locationAddress, remoteMessage.getReceiveUser()); return message; } }

5. FileLoadUtils.java:向本地服务器上传数据

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
public class FileLoadUtils { private static final String TAG = "FileLoadUtils"; public FileLoadUtils() { } …… /** * 上传消息到服务器,表单形式上传 */ public static void postFile(final String url, final Map<String, String> map,String imgStr, File file,String param1,File file1, Callback callback) { OkHttpClient client = new OkHttpClient(); // form 表单形式上传 MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM); if (file != null) { Log.e("FileLoadUtils","file="+file.getPath()+","+file.getName()); // MediaType.parse() 里面是上传的文件类型。 RequestBody body = RequestBody.create(MediaType.parse("image/*"), file); String filename = file.getName(); // 参数分别为, 请求key ,文件名称 , RequestBody requestBody.addFormDataPart(imgStr, filename, body); } if (file1 != null) { Log.e("FileLoadUtils","file="+file1.getPath()+","+file1.getName()); // MediaType.parse() 里面是上传的文件类型。 RequestBody body = RequestBody.create(MediaType.parse("image/*"), file1); String filename = file1.getName(); // 参数分别为, 请求key ,文件名称 , RequestBody requestBody.addFormDataPart(param1, filename, body); } if (map != null) { // map 里面是请求中所需要的 key 和 value Set<Map.Entry<String, String>> entries = map.entrySet(); for (Map.Entry entry : entries) { String key = String.valueOf(entry.getKey()); String value = String.valueOf(entry.getValue()); Log.d("HttpUtils", "key=="+key+",value=="+value); requestBody.addFormDataPart(key,value); } } String token = SavePreferences.getString(Const.TOKEN_KEY); Request request = new Request.Builder().url(url).header("token", token).post(requestBody.build()).build(); // readTimeout("请求超时时间" , 时间单位); client.newBuilder().readTimeout(5000, TimeUnit.MILLISECONDS).build() .newCall(request).enqueue(callback); } /** * 获取文件保存地址,toUser指发送消息过来的好友名称 */ public static File createFileEm(String type,String FileName,String toUser) { String path = null; if (toUser != null && !toUser.equals("") ) { if (type.equals("3")) { path = BASE_PATH + toUser + "/voice/" ; } else if (type.equals("4")) { path = BASE_PATH + toUser + "/video/"; }else if (type.equals("6")) { path = BASE_PATH + toUser + "/file/"; } else { path = BASE_PATH + toUser + "/image/"; } } else { if (type.equals("3")) { path = PathUtil.getInstance().getVoicePath() + "/" ; } else if (type.equals("4")) { path = PathUtil.getInstance().getVideoPath() + "/"; }else if (type.equals("6")) { path = PathUtil.getInstance().getFilePath() + "/"; } else { path = PathUtil.getInstance().getImagePath() + "/"; } } File file = new File(path); /** *如果文件夹不存在就创建 */ if (!file.exists()) { file.mkdirs(); } return new File(path, FileName); } /** * 获取视频的缩略图路径 */ public static String getThumnailPath(String fromUser,String videoPath) { String fileName = "thvideo" + System.currentTimeMillis(); createFileEm("5",fileName,fromUser); // File file = new File(getMSNBasePath("5",fromUser), fileName); File file = createFileEm("5",fileName,fromUser); try { FileOutputStream fos = new FileOutputStream(file); Bitmap ThumbBitmap = ThumbnailUtils.createVideoThumbnail(videoPath, 3); ThumbBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.close(); } catch (Exception e) { e.printStackTrace(); } return file.getAbsolutePath(); }

6. 发送企业名片后的显示:

发送完信息后,有个UI刷新的过程messageList.refreshSelectLast();----> messageAdapter.refreshSelectLast();

EaseMessageAdapter.java

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
public class EaseMessageAdapter extends BaseAdapter{ private final static String TAG = "EaseMessageAdapter"; private Context context; private static final int HANDLER_MESSAGE_REFRESH_LIST = 0; private static final int HANDLER_MESSAGE_SELECT_LAST = 1; private static final int HANDLER_MESSAGE_SEEK_TO = 2; private static final int MESSAGE_TYPE_RECV_TXT = 0; private static final int MESSAGE_TYPE_SENT_TXT = 1; private static final int MESSAGE_TYPE_SENT_IMAGE = 2; private static final int MESSAGE_TYPE_SENT_LOCATION = 3; private static final int MESSAGE_TYPE_RECV_LOCATION = 4; private static final int MESSAGE_TYPE_RECV_IMAGE = 5; private static final int MESSAGE_TYPE_SENT_VOICE = 6; private static final int MESSAGE_TYPE_RECV_VOICE = 7; private static final int MESSAGE_TYPE_SENT_VIDEO = 8; private static final int MESSAGE_TYPE_RECV_VIDEO = 9; private static final int MESSAGE_TYPE_SENT_FILE = 10; private static final int MESSAGE_TYPE_RECV_FILE = 11; private static final int MESSAGE_TYPE_SENT_EXPRESSION = 12; private static final int MESSAGE_TYPE_RECV_EXPRESSION = 13; private static final int MESSAGE_TYPE_SEND_CARD = 14; private static final int MESSAGE_TYPE_RECV_CARD = 15; private EMConversation conversation; EMMessage[] messages = null; private String toChatUsername; private MessageListItemClickListener itemClickListener; private EaseCustomChatRowProvider customRowProvider; private ListView listView; private EaseMessageListItemStyle itemStyle; public EaseMessageAdapter(Context context, String username, int chatType, ListView listView) { this.context = context; this.listView = listView; toChatUsername = username; this.conversation = EMClient.getInstance().chatManager().getConversation(username, EaseCommonUtils.getConversationType(chatType), true); } Handler handler = new Handler() { private void refreshList() { // you should not call getAllMessages() in UI thread // otherwise there is problem when refreshing UI and there is new message arrive java.util.List<EMMessage> var = conversation.getAllMessages(); Log.e(TAG,"EMMessage.size="+var.size()); messages = var.toArray(new EMMessage[var.size()]); conversation.markAllMessagesAsRead(); notifyDataSetChanged(); } @Override public void handleMessage(android.os.Message message) { switch (message.what) { case HANDLER_MESSAGE_REFRESH_LIST: refreshList(); break; case HANDLER_MESSAGE_SELECT_LAST: if (messages != null && messages.length > 0) { listView.setSelection(messages.length - 1); } break; case HANDLER_MESSAGE_SEEK_TO: int position = message.arg1; listView.setSelection(position); break; default: break; } } }; public void refresh() { if (handler.hasMessages(HANDLER_MESSAGE_REFRESH_LIST)) { return; } android.os.Message msg = handler.obtainMessage(HANDLER_MESSAGE_REFRESH_LIST); handler.sendMessage(msg); } /** * refresh and select the last */ public void refreshSelectLast() { final int TIME_DELAY_REFRESH_SELECT_LAST = 100; handler.removeMessages(HANDLER_MESSAGE_REFRESH_LIST); handler.removeMessages(HANDLER_MESSAGE_SELECT_LAST); handler.sendEmptyMessageDelayed(HANDLER_MESSAGE_REFRESH_LIST, TIME_DELAY_REFRESH_SELECT_LAST); handler.sendEmptyMessageDelayed(HANDLER_MESSAGE_SELECT_LAST, TIME_DELAY_REFRESH_SELECT_LAST); } /** * refresh and seek to the position */ public void refreshSeekTo(int position) { handler.sendMessage(handler.obtainMessage(HANDLER_MESSAGE_REFRESH_LIST)); } public EMMessage getItem(int position) { if (messages != null && position < messages.length) { return messages[position]; } return null; } public long getItemId(int position) { return position; } /** * get count of messages */ public int getCount() { return messages == null ? 0 : messages.length; } /** * get number of message type, here 14 = (EMMessage.Type) * 2 */ public int getViewTypeCount() { if(customRowProvider != null && customRowProvider.getCustomChatRowTypeCount() > 0){ return customRowProvider.getCustomChatRowTypeCount() + 14; } return 14; } /** * get type of item */ public int getItemViewType(int position) { EMMessage message = getItem(position); if (message == null) { return -1; } if(customRowProvider != null && customRowProvider.getCustomChatRowType(message) > 0){ return customRowProvider.getCustomChatRowType(message) + 13; } if (message.getType() == EMMessage.Type.TXT) { if(message.getBooleanAttribute(EaseConstant.MESSAGE_ATTR_IS_BIG_EXPRESSION, false)){ return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_EXPRESSION : MESSAGE_TYPE_SENT_EXPRESSION; } //企业名片 if (message.getBooleanAttribute("is_office",false)) { return message.direct() == EMMessage.Direct.RECEIVE? MESSAGE_TYPE_RECV_CARD: MESSAGE_TYPE_SEND_CARD; } return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_TXT : MESSAGE_TYPE_SENT_TXT; } if (message.getType() == EMMessage.Type.IMAGE) { return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_IMAGE : MESSAGE_TYPE_SENT_IMAGE; } if (message.getType() == EMMessage.Type.LOCATION) { return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_LOCATION : MESSAGE_TYPE_SENT_LOCATION; } if (message.getType() == EMMessage.Type.VOICE) { return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_VOICE : MESSAGE_TYPE_SENT_VOICE; } if (message.getType() == EMMessage.Type.VIDEO) { return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_VIDEO : MESSAGE_TYPE_SENT_VIDEO; } if (message.getType() == EMMessage.Type.FILE) { return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_FILE : MESSAGE_TYPE_SENT_FILE; } return -1;// invalid } //重点 protected EaseChatRowPresenter createChatRowPresenter(EMMessage message, int position) { Log.e(TAG,"createChatRowPresenter"); if(customRowProvider != null && customRowProvider.getCustomChatRow(message, position, this) != null){ return customRowProvider.getCustomChatRow(message, position, this); } EaseChatRowPresenter presenter = null; switch (message.getType()) { case TXT: if(message.getBooleanAttribute(EaseConstant.MESSAGE_ATTR_IS_BIG_EXPRESSION, false)){ presenter = new EaseChatBigExpressionPresenter(); }else{ Log.e(TAG,"TXT is_office"); if (message.getBooleanAttribute("is_office",false)) { Log.e(TAG,"TXT is_office true"); presenter = new EaseChatCardPresenter(); } else { presenter = new EaseChatTextPresenter(); } } break; case LOCATION: presenter = new EaseChatLocationPresenter(); break; case FILE: presenter = new EaseChatFilePresenter(); break; case IMAGE: presenter = new EaseChatImagePresenter(); break; case VOICE: presenter = new EaseChatVoicePresenter(); break; case VIDEO: presenter = new EaseChatVideoPresenter(); break; default: break; } return presenter; } @SuppressLint("NewApi") public View getView(final int position, View convertView, ViewGroup parent) { EMMessage message = getItem(position); EaseChatRowPresenter presenter = null; Log.e(TAG,""+message.getBooleanAttribute("is_office",false)+","+message.getBody()); if (convertView == null) { presenter = createChatRowPresenter(message, position); convertView = presenter.createChatRow(context, message, position, this); convertView.setTag(presenter); } else { presenter = (EaseChatRowPresenter) convertView.getTag(); } presenter.setup(message, position, itemClickListener, itemStyle); return convertView; } public void setItemStyle(EaseMessageListItemStyle itemStyle){ this.itemStyle = itemStyle; } public void setItemClickListener(MessageListItemClickListener listener){ itemClickListener = listener; } public void setCustomChatRowProvider(EaseCustomChatRowProvider rowProvider){ customRowProvider = rowProvider; } }

7. EaseChatCardPresenter.java

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class EaseChatCardPresenter extends EaseChatRowPresenter { private static final String TAG = "EaseChatFilePresenter"; @Override protected EaseChatRow onCreateChatRow(Context cxt, EMMessage message, int position, BaseAdapter adapter) { return new EaseChatRowCard(cxt, message, position, adapter); } @Override public void onBubbleClick(EMMessage message) { EMTextMessageBody fileMessageBody = (EMTextMessageBody) message.getBody(); //点击发送完后的企业名片需要的操作,还没有处理 …… if (message.direct() == EMMessage.Direct.RECEIVE && !message.isAcked() && message.getChatType() == EMMessage.ChatType.Chat) { try { EMClient.getInstance().chatManager().ackMessageRead(message.getFrom(), message.getMsgId()); } catch (HyphenateException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

8.EaseChatRowCard.java

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
public class EaseChatRowCard extends EaseChatRow{ private static final String TAG = "EaseChatRowCard"; protected TextView fileNameView; protected TextView fileSizeView; protected TextView fileStateView; protected TextView tvOfficeAddr; protected TextView tvOfficeTel; private EMTextMessageBody fileMessageBody; public EaseChatRowCard(Context context, EMMessage message, int position, BaseAdapter adapter) { super(context, message, position, adapter); } @Override protected void onInflateView() { inflater.inflate(message.direct() == EMMessage.Direct.RECEIVE ? R.layout.ease_row_received_card : R.layout.ease_row_sent_card, this); } @Override protected void onFindViewById() { fileNameView = (TextView) findViewById(R.id.tv_file_name); fileSizeView = (TextView) findViewById(R.id.tv_file_size); fileStateView = (TextView) findViewById(R.id.tv_file_state); percentageView = (TextView) findViewById(R.id.percentage); tvOfficeAddr = (TextView) findViewById(R.id.tv_officeAddr); tvOfficeTel = (TextView) findViewById(R.id.tv_officeTel); } @Override protected void onSetUpView() { fileMessageBody = (EMTextMessageBody) message.getBody(); String content = fileMessageBody.getMessage(); Log.e(TAG,"content="+content); if (message.getBooleanAttribute("is_office",false)) { String[] contentArr = content.split(","); OfficeCard card = new OfficeCard(); card.setOfficeId(contentArr[0]); card.setOfficeName(contentArr[1]); card.setAddr(contentArr[2]); card.setTel(contentArr[3]); fileNameView.setText(card.getOfficeName()); tvOfficeAddr.setText(card.getAddr()); tvOfficeTel.setText(card.getTel()); } } @Override protected void onViewUpdate(EMMessage msg) { switch (msg.status()) { case CREATE: onMessageCreate(); break; case SUCCESS: onMessageSuccess(); break; case FAIL: onMessageError(); break; case INPROGRESS: onMessageInProgress(); break; } } private void onMessageCreate() { progressBar.setVisibility(View.VISIBLE); if (percentageView != null) percentageView.setVisibility(View.INVISIBLE); if (statusView != null) statusView.setVisibility(View.INVISIBLE); } private void onMessageSuccess() { progressBar.setVisibility(View.INVISIBLE); if (percentageView != null) percentageView.setVisibility(View.INVISIBLE); if (statusView != null) statusView.setVisibility(View.INVISIBLE); } private void onMessageError() { progressBar.setVisibility(View.INVISIBLE); if (percentageView != null) percentageView.setVisibility(View.INVISIBLE); if (statusView != null) statusView.setVisibility(View.VISIBLE); } private void onMessageInProgress() { progressBar.setVisibility(View.VISIBLE); if (percentageView != null) { percentageView.setVisibility(View.VISIBLE); percentageView.setText(message.progress() + "%"); } if (statusView != null) statusView.setVisibility(View.INVISIBLE); } }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持靠谱客。

最后

以上就是飘逸钢笔最近收集整理的关于Android实现聊天记录上传本地服务器(即时通讯)的全部内容,更多相关Android实现聊天记录上传本地服务器(即时通讯)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(112)

评论列表共有 0 条评论

立即
投稿
返回
顶部