Android实现聊天记录上传本地服务器(即时通讯)

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

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

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页面调用;

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的发送接口,以向本地服务器发送消息;

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中获取聊天记录后,将各种类型的聊天记录转化成相应的格式:

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:向本地服务器上传数据

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

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

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

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);
 }
}

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

(0)

相关推荐

  • 详解Android 获取手机中微信聊天记录方法

    首先我们要知道,微信的聊天记录一般是不提供给我们获取的,所以一般情况下我们手机没root的话就拿不到了.就算是root后的手机,想要获取微信的EnMicroMsg.db文件并且解密它.打开它也有点难度. 下面我们就来演示怎么从安卓设备的手机中拿到微信的数据文件吧~ 实验软件 :Android Studio实验设备:Root过的真机一部一.拿到数据库文件EnMicroMsg.db 一步步来,打开Android Studio的File Explorer:Tools –> Android –> An

  • Android破解微信获取聊天记录和通讯录信息(静态方式)

    一.猜想数据存放路径 微信现在是老少皆宜,大街小巷都在使用,已经替代了传统的短信聊天方式了,只要涉及到聊天就肯定有隐私消息,那么本文就来讲解如何获取微信的聊天记录以及通讯录信息. 首先我们在没有网络的时候,打开微信同样可以查看聊天记录,说明微信会把聊天记录保存到本地,那么这么多信息肯定会保存在数据库中,所以我们可以去查看微信的databases目录看看内容: 可惜的是,我们在这个里面并没有发现一些有用的数据,所以这时候就了解到了微信因为把重要信息的数据库存在其他目录下面,我们可以直接把微信的整个

  • Android如何获取QQ与微信的聊天记录并保存到数据库详解

    前言 提前说明下:(该方法只适用于监控自己拥有的微信或者QQ ,无法监控或者盗取其他人的聊天记录.本文只写了如何获取聊天记录,服务器落地程序并不复杂,不做赘述.写的仓促,有错别字还请见谅.) 为了获取黑产群的动态,有同事潜伏在大量的黑产群(QQ 微信)中,干起了无间道的工作.随着黑产群数量的激增,同事希望能自动获取黑产群的聊天信息,并交付风控引擎进行风险评估.于是,我接到了这么一个工作-- 分析了一通需求说明,总结一下: 能够自动获取微信和 QQ群的聊天记录 只要文字记录,图片和表情包,语音之类

  • Android实现聊天记录上传本地服务器(即时通讯)

    即时通讯功能,使用SDK里封装的方法,获取聊天记录,接口请求成功,但获取不到数据.使用本地的服务器保存聊天记录,实现方法如下: 1. ChatFragment.java中请求聊天记录: public class ChatFragment extends EaseChatFragment implements EaseChatFragmentHelper { @Override protected void setUpView() { setChatFragmentHelper(this); St

  • elementui+vue+axios实现文件上传本地服务器

    本文实例为大家分享了elementui+vue+axios实现文件上传本地服务器的具体代码,供大家参考,具体内容如下 文件上传的原理 加入文件上传的依赖 <!--文件上传的依赖-->     <dependency>       <groupId>commons-fileupload</groupId>       <artifactId>commons-fileupload</artifactId>       <versio

  • Android将图片上传到php服务器的实例代码

    layout中很普通,就是两个button和一个ImageView <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height=&q

  • asp将本地的文件上传到服务器

    今天我们讲解如何利用asp的上传功能将本地的文件上传到服务器上. 最简系统包括下面三个文件: upload.htm                         --上传口文件,选择本地文件 uploadimg.asp                  --上传程序控制文件 upload_5xsoft.inc            --无组件上传类,此文件初学者不用学习,只要会用就可以了 upload.htm内容----上传口文件,选择本地文件 <html> <head> <

  • Android选择图片或拍照图片上传到服务器

    最近要搞一个项目,需要上传相册和拍照的图片,不负所望,终于完成了!  不过需要说明一下,其实网上很多教程拍照的图片,都是缩略图不是很清晰,所以需要在调用照相机的时候,事先生成一个地址,用于标识拍照的图片URI 具体上传代码: 1.选择图片和上传界面,包括上传完成和异常的回调监听 package com.spring.sky.image.upload; import java.util.HashMap; import java.util.Map; import android.app.Activi

  • android实现上传本地图片到网络功能

    本文实例为大家分享了android上传本地图片到网络的具体代码,供大家参考,具体内容如下 首先这里用到了Okhttp 所以需要一个依赖: compile 'com.squareup.okhttp3:okhttp:3.9.0' xml布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res

  • Android 通过webservice上传多张图片到指定服务器详解

    Android 通过webservice上传多张图片到指定服务器详解 当你浏览这个的时候相信你对webservice的基本应用已经有一定的了解了,若是还没有明白的小伙伴,可以看我前面写的文章点击打开链接,这几天在开发一款app,需要上传图片到指定服务器吧,但是我刚开始以为在网上面应该有这样的好文章的吧,结果我在网络上找了好多代码,在传递图片的过程中,遇到各种bug,真是国人的东西就是喜欢复制别人的,自己不动手检验一下代码的正确性,哎,我也是无语了,然后我决定花点时间来填补一下这个空缺,写了这一片

  • JavaScript实现图片本地预览功能【不用上传至服务器】

    本文实例讲述了JavaScript实现图片本地预览功能.分享给大家供大家参考,具体如下: 实现一个在file文件域中选定图片文件之后,马上进行预览.不用预上传到服务器,整缩略图再打回前端用Ajax去预览的.直接利用JavaScript即可以完成,而且还可以兼容IE6.具体效果,如下图所示: 具体实现是在非IE浏览器利用HTML5去显示,在IE浏览器则直接调用IE的滤镜功能去实现.具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tra

  • Android 通过httppost上传文本文件到服务器的实例代码

    废话不多说了,直接给大家贴关键代码了. /** * 往服务器上上传文本 比如log日志 * @param urlstr 请求的url * @param uploadFile log日志的路径 * /mnt/shell/emulated/0/LOG/LOG.log * @param newName log日志的名字 LOG.log * @return */ public static void httpPost(Activity activity,String urlstr,String uplo

  • 详解Node.js一行命令上传本地文件到服务器

    现在存在的问题 每次打包完, 都要打开 FileZilla 一顿拖拽然后才能上传代码, 那就立马撸一个自动化脚本就完事了 publish-sftp Github 传送门(顺便来骗个Star) 以后一行命令上传本地文件到服务器啦 publish-sftp -c // 完事 安全性 项目组已经跑了大半年, 没出过幺蛾子, 可放心使用 实现 基于 ssh2-sftp-client 快速上手 install sudo npm i publish-sftp -g sudo npm link publish

随机推荐