android 环信怎么手动把ios 环信获取未读消息息设置成已读

匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。4804人阅读
Android(25)
还原问题:
如图主Ui是activity,下侧的围观区是Fragment,根据环信的demo,上面聊天区可以正常刷新UI。
但是围观区数据源变化,但是不能刷新UI。
研究一个下午,理了好久逻辑。发现我的问题是:
chatActivity的事件监听(接收新消息),是通知activity的列表更新(上侧),但是没有通知围观区的列表更新。
解决办法:
在监听事件中通知围观区更新数据
下面附上我的代码:
这是主UI activity
package com.example.administrator.bazipaipan.
import android.app.ProgressD
import android.content.C
import android.content.I
import android.database.C
import android.graphics.B
import android.graphics.BitmapF
import android.graphics.C
import android.graphics.drawable.D
import android.media.ThumbnailU
import android.net.U
import android.os.B
import android.os.B
import android.os.H
import android.os.PowerM
import android.provider.MediaS
import android.support.design.widget.TabL
import android.support.v4.app.F
import android.support.v4.app.FragmentM
import android.support.v4.app.FragmentPagerA
import android.support.v4.view.ViewP
import android.support.v4.widget.SwipeRefreshL
import android.support.v7.app.ActionB
import android.support.v7.widget.T
import android.text.ClipboardM
import android.text.E
import android.text.TextU
import android.text.TextW
import android.util.L
import android.view.G
import android.view.KeyE
import android.view.M
import android.view.MenuI
import android.view.MotionE
import android.view.V
import android.view.ViewG
import android.view.WindowM
import android.view.inputmethod.EditorI
import android.view.inputmethod.InputMethodM
import android.widget.AbsListV
import android.widget.AdapterV
import android.widget.EditT
import android.widget.FrameL
import android.widget.ImageV
import android.widget.LinearL
import android.widget.ListV
import android.widget.ProgressB
import android.widget.RelativeL
import android.widget.TextV
import android.widget.T
import com.easemob.EMChatRoomChangeL
import com.easemob.EME
import com.easemob.EMEventL
import com.easemob.EMNotifierE
import com.easemob.EMValueCallB
import com.easemob.chat.EMChatM
import com.easemob.chat.EMChatR
import com.easemob.chat.EMC
import com.easemob.chat.EMG
import com.easemob.chat.EMGroupM
import com.easemob.chat.EMM
import com.easemob.chat.ImageMessageB
import com.easemob.chat.LocationMessageB
import com.easemob.chat.NormalFileMessageB
import com.easemob.chat.TextMessageB
import com.easemob.chat.VideoMessageB
import com.easemob.chat.VoiceMessageB
import com.easemob.exceptions.EaseMobE
import com.easemob.util.EML
import com.easemob.util.PathU
import com.easemob.util.VoiceR
import com.example.administrator.bazipaipan.BaseA
import com.example.administrator.bazipaipan.MyA
import com.example.administrator.bazipaipan.R;
import com.example.administrator.bazipaipan.chat.dialogActivity.AugurBackDialogA
import com.example.administrator.bazipaipan.chat.fragment.ChatContributeF
import com.example.administrator.bazipaipan.chat.fragment.ChatHistoryF
import com.example.administrator.bazipaipan.chat.fragment.ChatLookerF
import com.example.administrator.bazipaipan.chat.fragment.ChatQueueF
import com.example.administrator.bazipaipan.chat.huanxin.DemoHXSDKH
import com.example.administrator.bazipaipan.chat.huanxin.activity.AlertD
import com.example.administrator.bazipaipan.chat.huanxin.activity.BaiduMapA
import com.example.administrator.bazipaipan.chat.huanxin.adapter.ExpressionA
import com.example.administrator.bazipaipan.chat.huanxin.adapter.ExpressionPagerA
import com.example.administrator.bazipaipan.chat.huanxin.adapter.MessageA
import com.example.administrator.bazipaipan.chat.huanxin.adapter.VoicePlayClickL
import com.example.administrator.bazipaipan.chat.huanxin.applib.controller.HXSDKH
import com.example.administrator.bazipaipan.chat.monU
import com.example.administrator.bazipaipan.chat.huanxin.utils.ImageU
import com.example.administrator.bazipaipan.chat.huanxin.utils.SmileU
import com.example.administrator.bazipaipan.chat.huanxin.widget.ExpandGridV
import com.example.administrator.bazipaipan.chat.huanxin.widget.PasteEditT
import com.example.administrator.bazipaipan.chat.receiver.NewMessageBroadcastR
import com.example.administrator.bazipaipan.login.model.MyU
import com.example.administrator.bazipaipan.utils.BmobU
import com.example.administrator.bazipaipan.widget.VerticalSwipeRefreshL
import java.io.F
import java.io.FileOutputS
import java.io.IOE
import java.lang.reflect.F
import java.util.ArrayL
import java.util.L
import butterknife.ButterK
import cn.bmob.v3.BmobQ
import cn.bmob.v3.listener.GetL
import cn.bmob.v3.listener.UpdateL
* Created by 王中阳 on .
public class ChatContainerActivity extends BaseActivity implements TabLayout.OnTabSelectedListener, View.OnClickListener, EMEventListener, TextView.OnEditorActionListener {
public static final String TAG = “ChatContainerActivity”;
private ChatContainerA
//自定义测试
private TabLayout mTabL
private ViewPager mViewP
private List mTitleList = new ArrayList&&();//页卡标题集合
private List mFragmentList = new ArrayList&&();//页卡视图集合
private ChatLookerFragment chatLookerF
private ChatQueueFragment chatQueueF
private ChatContributeFragment chatContributeF
//actionbar相关
//聊天列表
private VerticalSwipeRefreshLayout mSwipeL
private LinearLayout chatmain_container_focusnum_sel, chatmain_container_
private TextView tv_chatmain_focusnum, tv_chatmain_focusnum_
//测算历史
private ChatHistoryFragment chatHistoryF
private FrameLayout fl_container_chatmain_
private MenuI
//下部围观区整体
private LinearLayout ll_container_
//单聊逻辑
private EditText et_chatlooker_
//发送给谁
大师或者是命主
非游客身份
NewMessageBroadcastReceiver msgR
//聊天输入框总容器
LinearLayout chatlooker_container_
chatdemo up
private static final int REQUEST_CODE_EMPTY_HISTORY = 2;
public static final int REQUEST_CODE_CONTEXT_MENU = 3;
private static final int REQUEST_CODE_MAP = 4;
public static final int REQUEST_CODE_TEXT = 5;
public static final int REQUEST_CODE_VOICE = 6;
public static final int REQUEST_CODE_PICTURE = 7;
public static final int REQUEST_CODE_LOCATION = 8;
public static final int REQUEST_CODE_NET_DISK = 9;
public static final int REQUEST_CODE_FILE = 10;
public static final int REQUEST_CODE_COPY_AND_PASTE = 11;
public static final int REQUEST_CODE_PICK_VIDEO = 12;
public static final int REQUEST_CODE_DOWNLOAD_VIDEO = 13;
public static final int REQUEST_CODE_VIDEO = 14;
public static final int REQUEST_CODE_DOWNLOAD_VOICE = 15;
public static final int REQUEST_CODE_SELECT_USER_CARD = 16;
public static final int REQUEST_CODE_SEND_USER_CARD = 17;
public static final int REQUEST_CODE_CAMERA = 18;
public static final int REQUEST_CODE_LOCAL = 19;
public static final int REQUEST_CODE_CLICK_DESTORY_IMG = 20;
public static final int REQUEST_CODE_GROUP_DETAIL = 21;
public static final int REQUEST_CODE_SELECT_VIDEO = 23;
public static final int REQUEST_CODE_SELECT_FILE = 24;
public static final int REQUEST_CODE_ADD_TO_BLACKLIST = 25;
public static final int RESULT_CODE_COPY = 1;
public static final int RESULT_CODE_DELETE = 2;
public static final int RESULT_CODE_FORWARD = 3;
public static final int RESULT_CODE_OPEN = 4;
public static final int RESULT_CODE_DWONLOAD = 5;
public static final int RESULT_CODE_TO_CLOUD = 6;
public static final int RESULT_CODE_EXIT_GROUP = 7;
public static final int CHATTYPE_SINGLE = 1;
public static final int CHATTYPE_GROUP = 2;
public static final int CHATTYPE_CHATROOM = 3;
//roomid 1测算
public static String roomID1; //1是测算群
public static String roomID2; // 2是围观群
public static String AUGURID; // 2是围观群
public static final String COPY_IMAGE = "EASEMOBIMG";
private View recordingC
private ImageView micI
private TextView recordingH
private ListView listV
private PasteEditText etinput_
private View buttonSetModeK
private View buttonSetModeV
private View buttonS
private View buttonPressToS
// private ViewPager expressionV
private LinearLayout emojiIconC
private LinearLayout btnC
private ImageView locationI
private ClipboardM
private ViewPager expressionV
private InputMethodM
private List&String&
private Drawable[] micI
private int chatType = 2;
private EMConve
public static ChatContainerActivity activityInstance =
// 给谁发送消息
private String toChatU
private VoiceRecorder voiceR
private MessageA
private File cameraF
static int resendP
private ImageView iv_emoticons_
private ImageView iv_emoticons_
private RelativeLayout edittext_
private ProgressBar loadmorePB;
private final int pagesize = 20;
private boolean haveMoreData =
private ImageView btnM
public String playMsgId;
private SwipeRefreshLayout swipeRefreshL
private Handler micImageHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
// 切换msg切换图片
micImage.setImageDrawable(micImages[msg.what]);
public EMG
public EMChatR
public boolean isR
//语音键盘的切换显示
RelativeLayout notvoice_
//围观区输入键盘
LinearLayout container_chatlooker_talkall, container_chatlooker_
String usertype = "0"; //用户身份 0围观区游客 1排队 2大师 3命主
从bmob表中获取
public static final String YOUKE = "0";
public static final String QUEUE = "1";
public static final String AUGUR = "2";
public static final String MINGZHU = "3";
public static final String OWNER = "4"; //群聊的群主
boolean isRoomOwner =
chatdemo down
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mychat);
ButterKnife.bind(this);
mycontext =
initRoomid();
initviews();
setUpView();
//进入2个群聊,先进入到围观的Fragment(非大师)大师进入
chatLogic();
//根据owner判断
//1从bmob中更新数据 先缓存在更新
getCurrentType(); //根据type 判断
private void initRoomid() {
// 判断单聊还是群聊
Bundle bundle = ChatContainerActivity.this.getIntent().getBundleExtra("bundle");
if (bundle == null) {
this.log("bundle" + bundle.toString());
roomID1 = bundle.getString("roomID1");
roomID2 = bundle.getString("roomID2");
AUGURID = bundle.getString("AUGURID");
MyApplication.getInstance().setRoomID2(roomID2);
MyApplication.getInstance().setAUGURID(AUGURID);
private void chatLogic() {
if (getRoomOwner()) {
chatlooker_container_inputall.setVisibility(View.VISIBLE);
chatlooker_container_inputall.setVisibility(View.GONE);
//获得当前房间的群主
private boolean getRoomOwner() {
//根据群聊ID从服务器获取群聊基本信息
new Thread(new Runnable() {
public void run() {
EMGroup group =
group = EMGroupManager.getInstance().getGroupFromServer(roomID1);
//保存获取下来的群聊基本信息
EMGroupManager.getInstance().createOrUpdateLocalGroup(group);
group.getMembers();//获取群成员
String owner = group.getOwner();//获取当前群主
//把房主id贡献给全局
MyApplication.getInstance().setOwnerId(owner);
String currentUser = EMChatManager.getInstance().getCurrentUser();
if (owner.equals(currentUser)) {
usertype = OWNER;
isRoomOwner =
isRoomOwner =
} catch (EaseMobException e) {
e.printStackTrace();
}).start();
return isRoomO
//获得当前user的type
private void getCurrentType() {
BmobQuery&MyUser& bmobQuery = new BmobQuery&&();
bmobQuery.getObject(this, BmobUtils.getCurrentId(mycontext), new GetListener&MyUser&() {
public void onSuccess(MyUser myUser) {
usertype = myUser.getType();
public void onFailure(int i, String s) {
log("chatcontainerActivity 查询type:" + s);
switch (usertype) {
//自己的房间
case OWNER:
container_chatlooker_talkall.setVisibility(View.GONE);
container_chatlooker_talkaugur.setVisibility(View.VISIBLE);
chatlooker_container_inputall.setVisibility(View.VISIBLE);
case MINGZHU:
chatlooker_container_inputall.setVisibility(View.VISIBLE);
case YOUKE:
container_chatlooker_talkall.setVisibility(View.VISIBLE);
container_chatlooker_talkaugur.setVisibility(View.GONE);
//隐藏掉当前的全键盘
chatlooker_container_inputall.setVisibility(View.GONE);
container_chatlooker_talkall.setVisibility(View.VISIBLE);
container_chatlooker_talkaugur.setVisibility(View.GONE);
//隐藏掉当前的全键盘
chatlooker_container_inputall.setVisibility(View.GONE);
//更新当前user的type
private void updateType(final String newType) {
String cuid = BmobUtils.getCurrentId(mycontext);
MyUser myUser = new MyUser();
myUser.setType(newType);
myUser.update(mycontext, cuid, new UpdateListener() {
public void onSuccess() {
if (newType.equals("0")) {
toast("回到围观区");
} else if (newType.equals("1")) {
toast("排队成功");
} else if (newType.equals("2")) {
toast("大师进入房间啦");
} else if (newType.equals("3")) {
toast("轮到您和大师算卦啦");
public void onFailure(int i, String s) {
private void setUpView() {
iv_emoticons_normal.setOnClickListener(this);
iv_emoticons_checked.setOnClickListener(this);
// position = getIntent().getIntExtra("position", -1);
clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
wakeLock = ((PowerManager) getSystemService(Context.POWER_SERVICE)).newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK, "demo");
// 判断单聊还是群聊
Bundle bundle = ChatContainerActivity.this.getIntent().getBundleExtra("bundle");
if (bundle == null) {
this.log("bundle" + bundle.toString());
chatType = Integer.valueOf(bundle.getString("chatType"));
log("chatType" + chatType);
toChatUsername = bundle.getString("roomID1");
roomID2 = bundle.getString("roomID1");
log("toChatUsername" + toChatUsername);
if (chatType == CHATTYPE_SINGLE) { // 单聊
toChatUsername = getIntent().getStringExtra(“userId”);
findViewById(R.id.container_voice_call).setVisibility(View.GONE);
findViewById(R.id.container_video_call).setVisibility(View.GONE); //视频通话不需要
if (chatType == CHATTYPE_GROUP) {
onGroupViewCreation();
onChatRoomViewCreation();
// for chatroom type, we only init conversation and create view adapter on success
if (chatType != CHATTYPE_CHATROOM) {
onConversationInit();
onListViewCreation();
// show forward message if the message is not null
String forward_msg_id = getIntent().getStringExtra("forward_msg_id");
if (forward_msg_id != null) {
// 显示发送要转发的消息
forwardMessage(forward_msg_id);
private void forwardMessage(String forward_msg_id) {
final EMMessage forward_msg = EMChatManager.getInstance().getMessage(forward_msg_id);
EMMessage.Type type = forward_msg.getType();
switch (type) {
// 获取消息内容,发送消息
String content = ((TextMessageBody) forward_msg.getBody()).getMessage();
sendText(content);
case IMAGE:
// 发送图片
String filePath = ((ImageMessageBody) forward_msg.getBody()).getLocalUrl();
if (filePath != null) {
File file = new File(filePath);
if (!file.exists()) {
// 不存在大图发送缩略图
filePath = ImageUtils.getThumbnailImagePath(filePath);
sendPicture(filePath);
if (forward_msg.getChatType() == EMMessage.ChatType.ChatRoom) {
EMChatManager.getInstance().leaveChatRoom(forward_msg.getTo());
private void onListViewCreation() {
adapter = new MessageAdapter(mycontext, toChatUsername, chatType);
// 显示消息
listView.setAdapter(adapter);
listView.setOnScrollListener(new ListScrollListener());
adapter.refreshSelectLast();
listView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
hideKeyboard();
more.setVisibility(View.GONE);
iv_emoticons_normal.setVisibility(View.VISIBLE);
iv_emoticons_checked.setVisibility(View.INVISIBLE);
emojiIconContainer.setVisibility(View.GONE);
btnContainer.setVisibility(View.GONE);
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
switch (v.getId()) {
//发送到测算区
case R.id.etinput_talkaugur:
//监听键盘发送功能
sendmsg = etinput_talkaugur.getText().toString().trim();
if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
if (TextUtils.isEmpty(sendmsg)) {
String s = etinput_talkaugur.getText().toString();
sendText(s);
* listview滑动监听listener
private class ListScrollListener implements AbsListView.OnScrollListener {
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
if (view.getFirstVisiblePosition() == 0 && !isloading && haveMoreData && conversation.getAllMessages().size() != 0) {
isloading =
loadmorePB.setVisibility(View.VISIBLE);
// sdk初始化加载的聊天记录为20条,到顶时去db里获取更多
List&EMMessage&
EMMessage firstMsg = conversation.getAllMessages().get(0);
// 获取更多messges,调用此方法的时候从db获取的messages
// sdk会自动存入到此conversation中
if (chatType == CHATTYPE_SINGLE)
messages = conversation.loadMoreMsgFromDB(firstMsg.getMsgId(), pagesize);
messages = conversation.loadMoreGroupMsgFromDB(firstMsg.getMsgId(), pagesize);
} catch (Exception e1) {
loadmorePB.setVisibility(View.GONE);
Thread.sleep(300);
} catch (InterruptedException e) {
if (messages.size() != 0) {
if (messages.size() & 0) {
adapter.refreshSeekTo(messages.size() - 1);
if (messages.size() != pagesize)
haveMoreData =
haveMoreData =
loadmorePB.setVisibility(View.GONE);
isloading =
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
protected void onConversationInit() {
if (chatType == CHATTYPE_SINGLE) {
} else if (chatType == CHATTYPE_GROUP) {
conversation = EMChatManager.getInstance().getConversationByType(toChatUsername, EMConversation.EMConversationType.GroupChat);
} else if (chatType == CHATTYPE_CHATROOM) {
// 把此会话的未读数置为0
conversation.markAllMessagesAsRead();
// 初始化db时,每个conversation加载数目是getChatOptions().getNumberOfMessagesLoaded
// 这个数目如果比用户期望进入会话界面时显示的个数不一样,就多加载一些
final List&EMMessage& msgs = conversation.getAllMessages();
int msgCount = msgs != null ? msgs.size() : 0;
if (msgCount & conversation.getAllMsgCount() && msgCount & pagesize) {
String msgId =
if (msgs != null && msgs.size() & 0) {
msgId = msgs.get(0).getMsgId();
if (chatType == CHATTYPE_SINGLE) {
conversation.loadMoreMsgFromDB(msgId, pagesize);
conversation.loadMoreGroupMsgFromDB(msgId, pagesize);
EMChatManager.getInstance().addChatRoomChangeListener(new EMChatRoomChangeListener() {
public void onChatRoomDestroyed(String roomId, String roomName) {
if (roomId.equals(toChatUsername)) {
public void onMemberJoined(String roomId, String participant) {
public void onMemberExited(String roomId, String roomName,
String participant) {
public void onMemberKicked(String roomId, String roomName,
String participant) {
if (roomId.equals(toChatUsername)) {
String curUser = EMChatManager.getInstance().getCurrentUser();
if (curUser.equals(participant)) {
EMChatManager.getInstance().leaveChatRoom(toChatUsername);
//----------以下是actionbar
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_chat, menu);
public boolean onOptionsItemSelected(MenuItem item) {
chatHistoryFragment = new ChatHistoryFragment();
FragmentManager fm = getSupportFragmentManager();
switch (item.getItemId()) {
case R.id.action_bagua:
case R.id.action_history:
fm.beginTransaction().add(R.id.fl_container_chatmain_history, chatHistoryFragment).commit();
case R.id.action_share:
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "/");
sendIntent.setType("text/plain");
startActivity(sendIntent);
//back键退出
case android.R.id.home:
Intent intent = new Intent(mycontext, AugurBackDialogActivity.class);
mycontext.startActivity(intent);
return super.onOptionsItemSelected(item);
//———以上是actionbar
private void initviews() {
chatdemo up
//最外层输入框
chatlooker_container_inputall = (LinearLayout) findViewById(R.id.chatlooker_container_inputall);
container_chatlooker_talkaugur = (LinearLayout) findViewById(R.id.container_chatlooker_talkaugur);
recordingContainer = findViewById(R.id.recording_container);
micImage = (ImageView) findViewById(R.id.mic_image);
recordingHint = (TextView) findViewById(R.id.recording_hint);
listView = (ListView) findViewById(R.id.rv_chat_list);
//显示聊天记录
etinput_talkaugur = (PasteEditText) findViewById(R.id.etinput_talkaugur);
//对话大师输入框
//消息键盘 和语音键盘的切换
buttonSetModeKeyboard = findViewById(R.id.btn_set_mode_keyboard);
notvoice_contaier = (RelativeLayout) findViewById(R.id.edittext_layout);
edittext_layout = (RelativeLayout) findViewById(R.id.notvoice_contaier); //发送消息框的容器
buttonSetModeVoice = findViewById(R.id.iv_chatlooker_voice);//语音键盘
buttonPressToSpeak = findViewById(R.id.btn_press_to_speak);
expressionViewpager = (ViewPager) findViewById(R.id.vPager); //表情翻页
emojiIconContainer = (LinearLayout) findViewById(R.id.ll_face_container); //emoji表情包容器
btnContainer = (LinearLayout) findViewById(R.id.ll_btn_container); //图片 语音按钮等
locationImgview = (ImageView) findViewById(R.id.btn_location);
//位置按钮
iv_emoticons_normal = (ImageView) findViewById(R.id.iv_emoticons_normal); //表情按钮
iv_emoticons_checked = (ImageView) findViewById(R.id.iv_emoticons_checked); //按下表情按钮
loadmorePB = (ProgressBar) findViewById(R.id.pb_load_more); //加载聊天的进度条
btnMore = (ImageView) findViewById(R.id.btn_more); //发送图片 位置等的按钮
iv_emoticons_normal.setVisibility(View.VISIBLE); //表情
iv_emoticons_checked.setVisibility(View.INVISIBLE); //表情
more = findViewById(R.id.more); //底部导航条
voiceCallBtn = (ImageView) findViewById(R.id.btn_voice_call);
videoCallBtn = (ImageView) findViewById(R.id.btn_video_call);
// 动画资源文件,用于录制语音时
micImages = new Drawable[]{getResources().getDrawable(R.drawable.record_animate_01),
getResources().getDrawable(R.drawable.record_animate_02),
getResources().getDrawable(R.drawable.record_animate_03),
getResources().getDrawable(R.drawable.record_animate_04),
getResources().getDrawable(R.drawable.record_animate_05),
getResources().getDrawable(R.drawable.record_animate_06),
getResources().getDrawable(R.drawable.record_animate_07),
getResources().getDrawable(R.drawable.record_animate_08),
getResources().getDrawable(R.drawable.record_animate_09),
getResources().getDrawable(R.drawable.record_animate_10),
getResources().getDrawable(R.drawable.record_animate_11),
getResources().getDrawable(R.drawable.record_animate_12),
getResources().getDrawable(R.drawable.record_animate_13),
getResources().getDrawable(R.drawable.record_animate_14)};
// 表情list
reslist = getExpressionRes(35);
// 初始化表情viewpager
List&View& views = new ArrayList&View&();
View gv1 = getGridChildView(1);
View gv2 = getGridChildView(2);
views.add(gv1);
views.add(gv2);
expressionViewpager.setAdapter(new ExpressionPagerAdapter(views));
edittext_layout.requestFocus();
voiceRecorder = new VoiceRecorder(micImageHandler);
buttonPressToSpeak.setOnTouchListener(new PressToSpeakListen());
etinput_talkaugur.setOnEditorActionListener(this);
etinput_talkaugur.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
edittext_layout.setBackgroundResource(R.drawable.input_bar_bg_active);
edittext_layout.setBackgroundResource(R.drawable.input_bar_bg_normal);
etinput_talkaugur.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
edittext_layout.setBackgroundResource(R.drawable.input_bar_bg_active);
more.setVisibility(View.GONE);
iv_emoticons_normal.setVisibility(View.VISIBLE);
iv_emoticons_checked.setVisibility(View.INVISIBLE);
emojiIconContainer.setVisibility(View.GONE);
btnContainer.setVisibility(View.GONE);
// 监听文字框
etinput_talkaugur.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!TextUtils.isEmpty(s)) {
btnMore.setVisibility(View.GONE);
buttonSend.setVisibility(View.VISIBLE);
btnMore.setVisibility(View.VISIBLE);
buttonSend.setVisibility(View.GONE);
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
public void afterTextChanged(Editable s) {
//刷新列表
聊天的列表
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.chat_swipe_layout);
swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light,
android.R.color.holo_orange_light, android.R.color.holo_red_light);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
public void run() {
if (listView.getFirstVisiblePosition() == 0 && !isloading && haveMoreData) {
List&EMMessage&
if (chatType == CHATTYPE_SINGLE) {
messages = conversation.loadMoreMsgFromDB(adapter.getItem(0).getMsgId(), pagesize);
messages = conversation.loadMoreGroupMsgFromDB(adapter.getItem(0).getMsgId(), pagesize);
} catch (Exception e1) {
swipeRefreshLayout.setRefreshing(false);
if (messages.size() & 0) {
adapter.notifyDataSetChanged();
adapter.refreshSeekTo(messages.size() - 1);
if (messages.size() != pagesize) {
haveMoreData =
haveMoreData =
isloading =
Toast.makeText(ChatContainerActivity.this, getResources().getString(R.string.no_more_messages), Toast.LENGTH_SHORT).show();
swipeRefreshLayout.setRefreshing(false);
chatdemo down
//测算历史
fl_container_chatmain_history = (FrameLayout) findViewById(R.id.fl_container_chatmain_history);
//围观区整体
ll_container_allbottom = (LinearLayout) findViewById(R.id.ll_container_allbottom);
ll_container_allbottom.setOnClickListener(this);
//关注切换
chatmain_container_focusnum = (LinearLayout) findViewById(R.id.chatmain_container_focusnum);
chatmain_container_focusnum.setOnClickListener(this);
chatmain_container_focusnum_sel = (LinearLayout) findViewById(R.id.chatmain_container_focusnum_sel);
chatmain_container_focusnum_sel.setOnClickListener(this);
tv_chatmain_focusnum = (TextView) findViewById(R.id.tv_chatmain_focusnum);
tv_chatmain_focusnum.setOnClickListener(this);
tv_chatmain_focusnum_sel = (TextView) findViewById(R.id.tv_chatmain_focusnum_sel);
tv_chatmain_focusnum_sel.setOnClickListener(this);
actionbar的切换
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ab = getSupportActionBar();
if (ab != null) {
ab.setHomeAsUpIndicator(R.drawable.back);
给左上角图标的左边加上一个返回的图标
ab.setDisplayHomeAsUpEnabled(true);
//隐藏icon logo
ab.setDisplayShowHomeEnabled(false);
ab.setDisplayShowTitleEnabled(true);
//tabview及viewpager联动效果
mViewPager = (ViewPager) mycontext.findViewById(R.id.chat_vp_view);
mTabLayout = (TabLayout) mycontext.findViewById(R.id.chat_tabs);
//添加页卡视图
mFragmentList.add(chatLookerFragment);
mFragmentList.add(chatQueueFragment);
mFragmentList.add(chatContributeFragment);
//添加页卡标题
mTitleList.add("围观区");
mTitleList.add("排队");
mTitleList.add("贡献");
mTabLayout.setTabMode(TabLayout.MODE_FIXED);//设置tab模式,当前为系统默认模式
mTabLayout.addTab(mTabLayout.newTab().setText(mTitleList.get(0)));//添加tab选项卡
mTabLayout.addTab(mTabLayout.newTab().setText(mTitleList.get(1)));
mTabLayout.addTab(mTabLayout.newTab().setText(mTitleList.get(2)));
MyChatPagerAdapter mAdapter = new MyChatPagerAdapter(getSupportFragmentManager(), mFragmentList, mycontext);
mViewPager.setAdapter(mAdapter);//给ViewPager设置适配器
mTabLayout.setupWithViewPager(mViewPager);//将TabLayout和ViewPager关联起来。
mTabLayout.setTabsFromPagerAdapter(mAdapter);//给Tabs设置适配器
if (mViewPager != null) {
setupViewPager(mViewPager);
mTabLayout.setupWithViewPager(mViewPager);
mTabLayout.setOnTabSelectedListener(this);
//切换 抽取
public void changeTab(int i) {
switch (i) {
chatLookerFragment.onRefresh();
//键盘消失
chatLogic();
chatQueueFragment.onRefresh();
//键盘消失
chatlooker_container_inputall.setVisibility(View.GONE);
chatContributeFragment.onRefresh();
//键盘消失
chatlooker_container_inputall.setVisibility(View.GONE);
private void setupViewPager(ViewPager viewPager) {
FragmentAdapter fragmentAdapter = new FragmentAdapter(mycontext.getSupportFragmentManager());
chatLookerFragment = new ChatLookerFragment();
fragmentAdapter.addFragment(chatLookerFragment, getString(R.string.chatlooker));
chatQueueFragment = new ChatQueueFragment();
fragmentAdapter.addFragment(chatQueueFragment, getString(R.string.chatqueue));
chatContributeFragment = new ChatContributeFragment();
fragmentAdapter.addFragment(chatContributeFragment, getString(R.string.chatcontribute));
viewPager.setAdapter(fragmentAdapter);
static class FragmentAdapter extends FragmentPagerAdapter {
private final List&Fragment& mFragments = new ArrayList&&();
private final List&String& mFragmentTitles = new ArrayList&&();
public FragmentAdapter(FragmentManager fm) {
super(fm);
public void addFragment(Fragment fragment, String title) {
mFragments.add(fragment);
mFragmentTitles.add(title);
public Fragment getItem(int position) {
return mFragments.get(position);
public int getCount() {
return mFragments.size();
public CharSequence getPageTitle(int position) {
return mFragmentTitles.get(position);
//tabview点击效果
public void onTabSelected(TabLayout.Tab tab) {
int pos = tab.getPosition();
mViewPager.setCurrentItem(pos);
changeTab(pos);
public void onTabUnselected(TabLayout.Tab tab) {
public void onTabReselected(TabLayout.Tab tab) {
class MyChatPagerAdapter extends FragmentPagerAdapter
private ChatContainerA
private List&Fragment&
public MyChatPagerAdapter(FragmentManager fm, List&Fragment& datas, ChatContainerActivity activity) {
super(fm);
this.activity =
this.datas =
public Fragment getItem(int position) {
return datas.get(position);
public int getCount() {
Log.e("datas", datas.size() + "");
return datas.size();
public CharSequence getPageTitle(int position) {
return mTitleList.get(position);//页卡标题
////添加页卡 初始化item
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, position);
public boolean isViewFromObject(View view, Object object) {
return view ==//官方推荐写法
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
protected void onStop() {
super.onStop();
//移除之前的viewpager数据 待缓存优化
mFragmentList.clear();
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(msgReceiver);
chatdemo 监听 up
private PowerManager.WakeLock wakeL
private ImageView voiceCallB
private ImageView videoCallB
* 按住说话listener
class PressToSpeakListen implements View.OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!CommonUtils.isExitsSdcard()) {
String st4 = getResources().getString(R.string.Send_voice_need_sdcard_support);
Toast.makeText(mycontext, st4, Toast.LENGTH_SHORT).show();
v.setPressed(true);
wakeLock.acquire();
if (VoicePlayClickListener.isPlaying)
VoicePlayClickListener.currentPlayListener.stopPlayVoice();
recordingContainer.setVisibility(View.VISIBLE);
recordingHint.setText(getString(R.string.move_up_to_cancel));
recordingHint.setBackgroundColor(Color.TRANSPARENT);
voiceRecorder.startRecording(null, toChatUsername, getApplicationContext());
} catch (Exception e) {
e.printStackTrace();
v.setPressed(false);
if (wakeLock.isHeld())
wakeLock.release();
if (voiceRecorder != null)
voiceRecorder.discardRecording();
recordingContainer.setVisibility(View.INVISIBLE);
Toast.makeText(mycontext, R.string.recoding_fail, Toast.LENGTH_SHORT).show();
case MotionEvent.ACTION_MOVE: {
if (event.getY() & 0) {
recordingHint.setText(getString(R.string.release_to_cancel));
recordingHint.setBackgroundResource(R.drawable.recording_text_hint_bg);
recordingHint.setText(getString(R.string.move_up_to_cancel));
recordingHint.setBackgroundColor(Color.TRANSPARENT);
case MotionEvent.ACTION_UP:
v.setPressed(false);
recordingContainer.setVisibility(View.INVISIBLE);
if (wakeLock.isHeld())
wakeLock.release();
if (event.getY() & 0) {
// discard the recorded audio.
voiceRecorder.discardRecording();
// stop recording and send voice file
String st1 = getResources().getString(R.string.Recording_without_permission);
String st2 = getResources().getString(R.string.The_recording_time_is_too_short);
String st3 = getResources().getString(R.string.send_failure_please);
int length = voiceRecorder.stopRecoding();
if (length & 0) {
sendVoice(voiceRecorder.getVoiceFilePath(), voiceRecorder.getVoiceFileName(toChatUsername),
Integer.toString(length), false);
} else if (length == EMError.INVALID_FILE) {
Toast.makeText(getApplicationContext(), st1, Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), st2, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(mycontext, st3, Toast.LENGTH_SHORT).show();
recordingContainer.setVisibility(View.INVISIBLE);
if (voiceRecorder != null)
voiceRecorder.discardRecording();
* 获取表情的gridview的子view
* @param i
private View getGridChildView(int i) {
View view = View.inflate(this, R.layout.expression_gridview, null);
ExpandGridView gv = (ExpandGridView) view.findViewById(R.id.gridview);
List&String& list = new ArrayList&String&();
if (i == 1) {
List&String& list1 = reslist.subList(0, 20);
list.addAll(list1);
} else if (i == 2) {
list.addAll(reslist.subList(20, reslist.size()));
list.add("delete_expression");
final ExpressionAdapter expressionAdapter = new ExpressionAdapter(this, 1, list);
gv.setAdapter(expressionAdapter);
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView&?& parent, View view, int position, long id) {
String filename = expressionAdapter.getItem(position);
// 文字输入框可见时,才可输入表情
// 按住说话可见,不让输入表情
if (buttonSetModeKeyboard.getVisibility() != View.VISIBLE) {
if (filename != "delete_expression") { // 不是删除键,显示表情
// 这里用的反射,所以混淆的时候不要混淆SmileUtils这个类
Class clz = Class.forName("com.easemob.chatuidemo.utils.SmileUtils");
Field field = clz.getField(filename);
etinput_talkaugur.append(SmileUtils.getSmiledText(mycontext,
(String) field.get(null)));
} else { // 删除文字或者表情
if (!TextUtils.isEmpty(etinput_talkaugur.getText())) {
int selectionStart = etinput_talkaugur.getSelectionStart();// 获取光标的位置
if (selectionStart & 0) {
String body = etinput_talkaugur.getText().toString();
String tempStr = body.substring(0, selectionStart);
int i = tempStr.lastIndexOf("[");// 获取最后一个表情的位置
if (i != -1) {
CharSequence cs = tempStr.substring(i, selectionStart);
if (SmileUtils.containsKey(cs.toString()))
etinput_talkaugur.getEditableText().delete(i, selectionStart);
etinput_talkaugur.getEditableText().delete(selectionStart - 1,
selectionStart);
etinput_talkaugur.getEditableText().delete(selectionStart - 1, selectionStart);
} catch (Exception e) {
public List&String& getExpressionRes(int getSum) {
List&String& reslist = new ArrayList&String&();
for (int x = 1; x &= getS x++) {
String filename = "ee_" +
reslist.add(filename);
//--------发送消息的方法
protected void onGroupViewCreation() {
group = EMGroupManager.getInstance().getGroup(toChatUsername);
if (group != null) {
((TextView) findViewById(R.id.toolbar_title)).setText(group.getGroupName());
((TextView) findViewById(R.id.toolbar_title)).setText(toChatUsername);
protected void onChatRoomViewCreation() {
final ProgressDialog pd = ProgressDialog.show(this, "", "Joining......");
EMChatManager.getInstance().joinChatRoom(toChatUsername, new EMValueCallBack&EMChatRoom&() {
public void onSuccess(EMChatRoom value) {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
public void run() {
pd.dismiss();
room = EMChatManager.getInstance().getChatRoom(toChatUsername);
if (room != null) {
((TextView) findViewById(R.id.name)).setText(room.getName());
((TextView) findViewById(R.id.name)).setText(toChatUsername);
EMLog.d(TAG, "join room success : " + room.getName());
onConversationInit();
onListViewCreation();
public void onError(final int error, String errorMsg) {
// TODO Auto-generated method stub
EMLog.d(TAG, "join room failure : " + error);
runOnUiThread(new Runnable() {
public void run() {
pd.dismiss();
* onActivityResult
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_CODE_EXIT_GROUP) {
setResult(RESULT_OK);
if (requestCode == REQUEST_CODE_CONTEXT_MENU) {
switch (resultCode) {
case RESULT_CODE_COPY: // 复制消息
EMMessage copyMsg = ((EMMessage) adapter.getItem(data.getIntExtra(“position”, -1)));
// clipboard.setText(SmileUtils.getSmiledText(ChatActivity.this,
// ((TextMessageBody) copyMsg.getBody()).getMessage()));
clipboard.setText(((TextMessageBody) copyMsg.getBody()).getMessage());
case RESULT_CODE_DELETE: // 删除消息
EMMessage deleteMsg = (EMMessage) adapter.getItem(data.getIntExtra(“position”, -1));
conversation.removeMessage(deleteMsg.getMsgId());
adapter.refreshSeekTo(data.getIntExtra(“position”, adapter.getCount()) - 1);
case RESULT_CODE_FORWARD: // 转发消息
EMMessage forwardMsg = (EMMessage) adapter.getItem(data.getIntExtra(“position”, 0));
Intent intent = new Intent(this, ForwardMessageActivity.class);
intent.putExtra(“forward_msg_id”, forwardMsg.getMsgId());
startActivity(intent);
if (resultCode == RESULT_OK) { // 清空消息
if (requestCode == REQUEST_CODE_EMPTY_HISTORY) {
// 清空会话
EMChatManager.getInstance().clearConversation(toChatUsername);
adapter.refresh();
} else if (requestCode == REQUEST_CODE_CAMERA) { // 发送照片
if (cameraFile != null && cameraFile.exists())
sendPicture(cameraFile.getAbsolutePath());
} else if (requestCode == REQUEST_CODE_SELECT_VIDEO) { // 发送本地选择的视频
int duration = data.getIntExtra("dur", 0);
String videoPath = data.getStringExtra("path");
File file = new File(PathUtil.getInstance().getImagePath(), "thvideo" + System.currentTimeMillis());
Bitmap bitmap =
FileOutputStream fos =
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, 3);
if (bitmap == null) {
EMLog.d("chatactivity", "problem load video thumbnail bitmap,use default icon");
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.app_panel_video_icon);
fos = new FileOutputStream(file);
pressFormat.JPEG, 100, fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
fos.close();
} catch (IOException e) {
e.printStackTrace();
if (bitmap != null) {
bitmap.recycle();
sendVideo(videoPath, file.getAbsolutePath(), duration / 1000);
} else if (requestCode == REQUEST_CODE_LOCAL) { // 发送本地图片
if (data != null) {
Uri selectedImage = data.getData();
if (selectedImage != null) {
sendPicByUri(selectedImage);
} else if (requestCode == REQUEST_CODE_SELECT_FILE) { // 发送选择的文件
if (data != null) {
Uri uri = data.getData();
if (uri != null) {
sendFile(uri);
} else if (requestCode == REQUEST_CODE_MAP) { // 地图
// 重发消息
} else if (requestCode == REQUEST_CODE_TEXT || requestCode == REQUEST_CODE_VOICE
|| requestCode == REQUEST_CODE_PICTURE || requestCode == REQUEST_CODE_LOCATION
|| requestCode == REQUEST_CODE_VIDEO || requestCode == REQUEST_CODE_FILE) {
resendMessage();
} else if (requestCode == REQUEST_CODE_COPY_AND_PASTE) {
if (!TextUtils.isEmpty(clipboard.getText())) {
String pasteText = clipboard.getText().toString();
if (pasteText.startsWith(COPY_IMAGE)) {
// 把图片前缀去掉,还原成正常的path
sendPicture(pasteText.replace(COPY_IMAGE, ""));
} else if (requestCode == REQUEST_CODE_ADD_TO_BLACKLIST) { // 移入黑名单
EMMessage deleteMsg = (EMMessage) adapter.getItem(data.getIntExtra(“position”, -1));
addUserToBlacklist(deleteMsg.getFrom());
} else if (conversation.getMsgCount() & 0) {
adapter.refresh();
setResult(RESULT_OK);
} else if (requestCode == REQUEST_CODE_GROUP_DETAIL) {
adapter.refresh();
* 显示或隐藏图标按钮页
* @param view
public void toggleMore(View view) {
if (more.getVisibility() == View.GONE) {
EMLog.d(TAG, "more gone");
hideKeyboard();
more.setVisibility(View.VISIBLE);
btnContainer.setVisibility(View.VISIBLE);
emojiIconContainer.setVisibility(View.GONE);
if (emojiIconContainer.getVisibility() == View.VISIBLE) {
emojiIconContainer.setVisibility(View.GONE);
btnContainer.setVisibility(View.VISIBLE);
iv_emoticons_normal.setVisibility(View.VISIBLE);
iv_emoticons_checked.setVisibility(View.INVISIBLE);
more.setVisibility(View.GONE);
* 消息图标点击事件
* @param view
public void onClick(View view) {
String st1 = getResources().getString(R.string.not_connect_to_server);
int id = view.getId();
if (id == R.id.btn_send) {// 点击发送按钮(发文字和表情)
String s = etinput_talkaugur.getText().toString();
sendText(s);
} else if (id == R.id.btn_take_picture) {
selectPicFromCamera();// 点击照相图标
} else if (id == R.id.btn_picture) {
selectPicFromLocal(); // 点击图片图标
} else if (id == R.id.btn_location) { // 位置
startActivityForResult(new Intent(this, BaiduMapActivity.class), REQUEST_CODE_MAP);
} else if (id == R.id.iv_emoticons_normal) { // 点击显示表情框
more.setVisibility(View.VISIBLE);
iv_emoticons_normal.setVisibility(View.INVISIBLE);
iv_emoticons_checked.setVisibility(View.VISIBLE);
btnContainer.setVisibility(View.GONE);
emojiIconContainer.setVisibility(View.VISIBLE);
hideKeyboard();
} else if (id == R.id.iv_emoticons_checked) { // 点击隐藏表情框
iv_emoticons_normal.setVisibility(View.VISIBLE);
iv_emoticons_checked.setVisibility(View.INVISIBLE);
btnContainer.setVisibility(View.VISIBLE);
emojiIconContainer.setVisibility(View.GONE);
more.setVisibility(View.GONE);
} else if (id == R.id.btn_video) {
// 点击摄像图标
Intent intent = new Intent(ChatActivity.this, ImageGridActivity.class);
startActivityForResult(intent, REQUEST_CODE_SELECT_VIDEO);
} else if (id == R.id.btn_file) { // 点击文件图标
selectFileFromLocal();
} else if (id == R.id.btn_voice_call) { // 点击语音电话图标
if (!EMChatManager.getInstance().isConnected())
Toast.makeText(this, st1, Toast.LENGTH_SHORT).show();
startActivity(new Intent(ChatActivity.this, VoiceCallActivity.class).putExtra(“username”,
toChatUsername).putExtra(“isComingCall”, false));
voiceCallBtn.setEnabled(false);
toggleMore(null);
} else if (id == R.id.btn_video_call) { // 视频通话
if (!EMChatManager.getInstance().isConnected())
Toast.makeText(this, st1, Toast.LENGTH_SHORT).show();
startActivity(new Intent(this, VideoCallActivity.class).putExtra(“username”, toChatUsername).putExtra(
“isComingCall”, false));
videoCallBtn.setEnabled(false);
toggleMore(null);
} else if (id == R.id.chatmain_container_focusnum) {
chatmain_container_focusnum_sel.setVisibility(View.VISIBLE);
chatmain_container_focusnum.setVisibility(View.GONE);
tv_chatmain_focusnum_sel.setText(“100”);
} else if (id == R.id.chatmain_container_focusnum_sel) {
chatmain_container_focusnum_sel.setVisibility(View.GONE);
chatmain_container_focusnum.setVisibility(View.VISIBLE);
tv_chatmain_focusnum.setText(“99”);
} else if (id == R.id.chat_tabs) {
fl_container_chatmain_history.setVisibility(View.GONE);
} else if (id == R.id.chat_vp_view) {
fl_container_chatmain_history.setVisibility(View.GONE);
* 事件监听
* 根据不同的位置刷新UI
* see {@link EMNotifierEvent}
public void onEvent(EMNotifierEvent event) {
switch (event.getEvent()) {
case EventNewMessage: {
//获取到message
EMMessage message = (EMMessage) event.getData();
String username =
//群组消息
if (message.getChatType() == EMMessage.ChatType.GroupChat || message.getChatType() == EMMessage.ChatType.ChatRoom) {
username = message.getTo();
//单聊消息
username = message.getFrom();
//如果是当前会话的消息,刷新聊天页面
if (username.equals(getToChatUsername())) {
refreshUIWithNewMessage();
//声音和震动提示有新消息
HXSDKHelper.getInstance().getNotifier().viberateAndPlayTone(message);
chatLookerFragment.onRefresh();
//如果消息不是和当前聊天ID的消息
HXSDKHelper.getInstance().getNotifier().onNewMsg(message);
chatLookerFragment.onRefresh();
case EventDeliveryAck: {
//获取到message
EMMessage message = (EMMessage) event.getData();
refreshUI();
case EventReadAck: {
//获取到message
EMMessage message = (EMMessage) event.getData();
refreshUI();
case EventOfflineMessage: {
//a list of offline messages
//List&EMMessage& offlineMessages = (List&EMMessage&) event.getData();
refreshUI();
public String getToChatUsername() {
return toChatU
public ListView getListView() {
return listV
private void refreshUIWithNewMessage() {
if (adapter == null) {
runOnUiThread(new Runnable() {
public void run() {
adapter.refreshSelectLast();
private void refreshUI() {
if (adapter == null) {
runOnUiThread(new Runnable() {
public void run() {
adapter.refresh();
* 照相获取图片
public void selectPicFromCamera() {
if (!CommonUtils.isExitsSdcard()) {
String st = getResources().getString(R.string.sd_card_does_not_exist);
Toast.makeText(getApplicationContext(), st, Toast.LENGTH_SHORT).show();
cameraFile = new File(PathUtil.getInstance().getImagePath(), MyApplication.getInstance().getUserName()
+ System.currentTimeMillis() + ".jpg");
cameraFile.getParentFile().mkdirs();
startActivityForResult(
new Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile)),
REQUEST_CODE_CAMERA);
* 选择文件
private void selectFileFromLocal() {
Intent intent =
if (Build.VERSION.SDK_INT & 19) {
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE_SELECT_FILE);
* 从图库获取图片
public void selectPicFromLocal() {
if (Build.VERSION.SDK_INT & 19) {
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE_LOCAL);
* 发送文本消息
* @param content message content
public void sendText(String content) {
if (content.length() & 0) {
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
// 如果是群聊,设置chattype,默认是单聊
if (chatType == CHATTYPE_GROUP) {
message.setChatType(EMMessage.ChatType.GroupChat);
} else if (chatType == CHATTYPE_CHATROOM) {
message.setChatType(EMMessage.ChatType.ChatRoom);
if (isRobot) {
message.setAttribute("em_robot_message", true);
TextMessageBody txtBody = new TextMessageBody(content);
// 设置消息body
message.addBody(txtBody);
// 设置要发给谁,用户username或者群聊groupid
message.setReceipt(toChatUsername);
// 把messgage加到conversation中
conversation.addMessage(message);
// 通知adapter有消息变动,adapter会根据加入的这条message显示消息和调用sdk的发送方法
adapter.refreshSelectLast();
etinput_talkaugur.setText("");
setResult(RESULT_OK);
* 发送语音
* @param filePath
* @param fileName
* @param length
* @param isResend
private void sendVoice(String filePath, String fileName, String length, boolean isResend) {
if (!(new File(filePath).exists())) {
final EMMessage message = EMMessage.createSendMessage(EMMessage.Type.VOICE);
// 如果是群聊,设置chattype,默认是单聊
if (chatType == CHATTYPE_GROUP) {
message.setChatType(EMMessage.ChatType.GroupChat);
} else if (chatType == CHATTYPE_CHATROOM) {
message.setChatType(EMMessage.ChatType.ChatRoom);
message.setReceipt(toChatUsername);
int len = Integer.parseInt(length);
VoiceMessageBody body = new VoiceMessageBody(new File(filePath), len);
message.addBody(body);
if (isRobot) {
message.setAttribute("em_robot_message", true);
conversation.addMessage(message);
adapter.refreshSelectLast();
setResult(RESULT_OK);
// send file
// sendVoiceSub(filePath, fileName, message);
} catch (Exception e) {
e.printStackTrace();
* 发送图片
* @param filePath
private void sendPicture(final String filePath) {
String to = toChatU
// create and add image message in view
final EMMessage message = EMMessage.createSendMessage(EMMessage.Type.IMAGE);
// 如果是群聊,设置chattype,默认是单聊
if (chatType == CHATTYPE_GROUP) {
message.setChatType(EMMessage.ChatType.GroupChat);
} else if (chatType == CHATTYPE_CHATROOM) {
message.setChatType(EMMessage.ChatType.ChatRoom);
message.setReceipt(to);
ImageMessageBody body = new ImageMessageBody(new File(filePath));
// 默认超过100k的图片会压缩后发给对方,可以设置成发送原图
// body.setSendOriginalImage(true);
message.addBody(body);
if (isRobot) {
message.setAttribute("em_robot_message", true);
conversation.addMessage(message);
listView.setAdapter(adapter);
adapter.refreshSelectLast();
setResult(RESULT_OK);
// more(more);
* 发送视频消息
private void sendVideo(final String filePath, final String thumbPath, final int length) {
final File videoFile = new File(filePath);
if (!videoFile.exists()) {
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.VIDEO);
// 如果是群聊,设置chattype,默认是单聊
if (chatType == CHATTYPE_GROUP) {
message.setChatType(EMMessage.ChatType.GroupChat);
} else if (chatType == CHATTYPE_CHATROOM) {
message.setChatType(EMMessage.ChatType.ChatRoom);
String to = toChatU
message.setReceipt(to);
VideoMessageBody body = new VideoMessageBody(videoFile, thumbPath, length, videoFile.length());
message.addBody(body);
if (isRobot) {
message.setAttribute("em_robot_message", true);
conversation.addMessage(message);
listView.setAdapter(adapter);
adapter.refreshSelectLast();
setResult(RESULT_OK);
} catch (Exception e) {
e.printStackTrace();
* 根据图库图片uri发送图片
* @param selectedImage
private void sendPicByUri(Uri selectedImage) {
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
String st8 = getResources().getString(R.string.cant_find_pictures);
if (cursor != null) {
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
if (picturePath == null || picturePath.equals("null")) {
Toast toast = Toast.makeText(this, st8, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
sendPicture(picturePath);
File file = new File(selectedImage.getPath());
if (!file.exists()) {
Toast toast = Toast.makeText(this, st8, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
sendPicture(file.getAbsolutePath());
* 发送位置信息
* @param latitude
* @param longitude
* @param imagePath
* @param locationAddress
private void sendLocationMsg(double latitude, double longitude, String imagePath, String locationAddress) {
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.LOCATION);
// 如果是群聊,设置chattype,默认是单聊
if (chatType == CHATTYPE_GROUP) {
message.setChatType(EMMessage.ChatType.GroupChat);
} else if (chatType == CHATTYPE_CHATROOM) {
message.setChatType(EMMessage.ChatType.ChatRoom);
LocationMessageBody locBody = new LocationMessageBody(locationAddress, latitude, longitude);
message.addBody(locBody);
message.setReceipt(toChatUsername);
if (isRobot) {
message.setAttribute("em_robot_message", true);
conversation.addMessage(message);
listView.setAdapter(adapter);
adapter.refreshSelectLast();
setResult(RESULT_OK);
* 发送文件
* @param uri
private void sendFile(Uri uri) {
String filePath =
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = {"_data"};
Cursor cursor =
cursor = getContentResolver().query(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow("_data");
if (cursor.moveToFirst()) {
filePath = cursor.getString(column_index);
} catch (Exception e) {
e.printStackTrace();
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
filePath = uri.getPath();
File file = new File(filePath);
if (file == null || !file.exists()) {
String st7 = getResources().getString(R.string.File_does_not_exist);
Toast.makeText(getApplicationContext(), st7, Toast.LENGTH_SHORT).show();
if (file.length() & 10 * 1024 * 1024) {
String st6 = getResources().getString(R.string.The_file_is_not_greater_than_10_m);
Toast.makeText(getApplicationContext(), st6, Toast.LENGTH_SHORT).show();
// 创建一个文件消息
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.FILE);
// 如果是群聊,设置chattype,默认是单聊
if (chatType == CHATTYPE_GROUP) {
message.setChatType(EMMessage.ChatType.GroupChat);
} else if (chatType == CHATTYPE_CHATROOM) {
message.setChatType(EMMessage.ChatType.ChatRoom);
message.setReceipt(toChatUsername);
// add message body
NormalFileMessageBody body = new NormalFileMessageBody(new File(filePath));
message.addBody(body);
if (isRobot) {
message.setAttribute("em_robot_message", true);
conversation.addMessage(message);
listView.setAdapter(adapter);
adapter.refreshSelectLast();
setResult(RESULT_OK);
* 重发消息
private void resendMessage() {
EMMessage msg =
msg = conversation.getMessage(resendPos);
// msg.setBackSend(true);
msg.status = EMMessage.Status.CREATE;
adapter.refreshSeekTo(resendPos);
* 隐藏软键盘
private void hideKeyboard() {
if (getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {
if (getCurrentFocus() != null)
manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
* 显示语音图标按钮
* @param view
public void setModeVoice(View view) {
hideKeyboard();
edittext_layout.setVisibility(View.GONE);
more.setVisibility(View.GONE);
view.setVisibility(View.GONE);
buttonSetModeKeyboard.setVisibility(View.VISIBLE);
buttonSend.setVisibility(View.GONE);
btnMore.setVisibility(View.VISIBLE);
buttonPressToSpeak.setVisibility(View.VISIBLE);
iv_emoticons_normal.setVisibility(View.VISIBLE);
iv_emoticons_checked.setVisibility(View.INVISIBLE);
btnContainer.setVisibility(View.VISIBLE);
emojiIconContainer.setVisibility(View.GONE);
* 显示键盘图标
* @param view
public void setModeKeyboard(View view) {
edittext_layout.setVisibility(View.VISIBLE);
more.setVisibility(View.GONE);
view.setVisibility(View.GONE);
buttonSetModeVoice.setVisibility(View.VISIBLE);
// etinput_talkaugur.setVisibility(View.VISIBLE);
etinput_talkaugur.requestFocus();
// buttonSend.setVisibility(View.VISIBLE);
buttonPressToSpeak.setVisibility(View.VISIBLE);
if (TextUtils.isEmpty(etinput_talkaugur.getText())) {
btnMore.setVisibility(View.VISIBLE);
buttonSend.setVisibility(View.GONE);
btnMore.setVisibility(View.GONE);
buttonSend.setVisibility(View.VISIBLE);
* 点击清空聊天记录
* @param view
public void emptyHistory(View view) {
String st5 = getResources().getString(R.string.Whether_to_empty_all_chats);
startActivityForResult(new Intent(this, AlertDialog.class).putExtra("titleIsCancel", true).putExtra("msg", st5)
.putExtra("cancel", true), REQUEST_CODE_EMPTY_HISTORY);
chatdemo 监听 down
protected void onResume() {
super.onResume();
changeTab(mViewPager.getCurrentItem());
if (group != null)
((TextView) findViewById(R.id.name)).setText(group.getGroupName());
voiceCallBtn.setEnabled(true);
videoCallBtn.setEnabled(true);
if (adapter != null) {
adapter.refresh();
DemoHXSDKHelper sdkHelper = (DemoHXSDKHelper) DemoHXSDKHelper.getInstance();
sdkHelper.pushActivity(this);
// register the event listener when enter the foreground
EMChatManager.getInstance().registerEventListener(
new EMNotifierEvent.Event[]{EMNotifierEvent.Event.EventNewMessage, EMNotifierEvent.Event.EventOfflineMessage,
EMNotifierEvent.Event.EventDeliveryAck, EMNotifierEvent.Event.EventReadAck});
这是 围观区的Fragment
package com.example.administrator.bazipaipan.chat.
import android.content.BroadcastR
import android.content.C
import android.content.DialogI
import android.content.I
import android.content.IntentF
import android.os.B
import android.os.H
import android.os.M
import android.support.annotation.N
import android.support.v4.app.F
import android.support.v4.widget.SwipeRefreshL
import android.support.v7.app.AlertD
import android.support.v7.widget.LinearLayoutM
import android.support.v7.widget.RecyclerV
import android.text.TextU
import android.view.KeyE
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.view.inputmethod.EditorI
import android.widget.B
import android.widget.EditT
import android.widget.ImageV
import android.widget.LinearL
import android.widget.ListV
import android.widget.TextV
import com.easemob.EMCallB
import com.easemob.EMNotifierE
import com.easemob.chat.EMC
import com.easemob.chat.EMChatM
import com.easemob.chat.EMC
import com.easemob.chat.EMM
import com.easemob.chat.TextMessageB
import com.example.administrator.bazipaipan.BaseA
import com.example.administrator.bazipaipan.MyA
import com.example.administrator.bazipaipan.R;
import com.example.administrator.bazipaipan.chat.ChatContainerA
import com.example.administrator.bazipaipan.chat.adapter.ChatGiftA
import com.example.administrator.bazipaipan.chat.adapter.ChatLookerA
import com.example.administrator.bazipaipan.chat.adapter.MyChatMsgA
import com.example.administrator.bazipaipan.chat.huanxin.DemoHXSDKH
import com.example.administrator.bazipaipan.chat.model.G
import com.example.administrator.bazipaipan.me.MeContainerA
import com.example.administrator.bazipaipan.me.fragment.RechargeF
import com.example.administrator.bazipaipan.widget.DividerItemD
import com.example.administrator.bazipaipan.widget.VerticalSwipeRefreshL
import java.util.ArrayL
import java.util.L
import butterknife.ButterK
import butterknife.OnC
import cn.bmob.v3.BmobQ
import cn.bmob.v3.listener.FindL
import static android.support.v7.widget.LinearLayoutManager.HORIZONTAL;
* Created by 王中阳 on .
* 1围观区发送消息 群聊
public class ChatLookerFragment extends Fragment implements ChatLookerAdapter.IClickListener, SwipeRefreshLayout.OnRefreshListener, TextView.OnEditorActionListener, View.OnClickListener, ChatGiftAdapter.IClickListener {
public static final String TAG = "ChatLookerFragment";
//1context
private ChatContainerA
//2view对象
private ListView recyclerV
//4适配器 围观区聊天
private MyChatMsgAdapter mA
//5网络加载更多
private VerticalSwipeRefreshLayout mSwipeL
private EditText et_chatlooker_ //围观推荐
private ImageView iv_chatlooker_
//赠送礼物
private RecyclerView rv_
private Button btn_chatgift_
private TextView tv_giftpop_hot, tv_giftpop_
private LinearLayout chatlooker_container_ //最外层容器
private ChatGiftAdapter chatGiftA
private List&Gift&
//------2级礼物
private LinearLayout givegift_container_second, givegift_container_
private TextView tv_goldnum_givegift, tv_rechargebtn, tv_givegift_second_name, tv_givegift_second_
private ImageView iv_givegift_second_head, iv_back_
private Button btn_givegift_
private LinearLayout container_chatlooker_talkaugur, container_chatlooker_
private EMConve
public static String roomID2 = // 2是围观群
NewMessageBroadcastReceiver msgR
//接口监听
static boolean isArrive =
public static ChatLookerFragment newInstance() {
ChatLookerFragment fragment = new ChatLookerFragment();
public ChatLookerFragment() {
public void onAttach(Context context) {
super.onAttach(context);
this.mycontext = (ChatContainerActivity)
registerBroadcast(); //注册广播
private LinearLayout chatlooker_container_
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//送礼物时隐藏键盘
container_chatlooker_talkaugur = (LinearLayout) mycontext.findViewById(R.id.container_chatlooker_talkaugur);
chatlooker_container_inputall = (LinearLayout) mycontext.findViewById(R.id.chatlooker_container_inputall);
roomID2 = MyApplication.getInstance().getRoomID2();
conversation = EMChatManager.getInstance().getConversation(roomID2);
updateUI();
private void registerBroadcast() {
msgReceiver = new NewMessageBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction());
intentFilter.setPriority(3);
mycontext.registerReceiver(msgReceiver, intentFilter);
EMChat.getInstance().setAppInited();
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_chatlooker, container, false);
et_chatlooker_lookerinput = (EditText) view.findViewById(R.id.et_chatlooker_lookerinput);
et_chatlooker_lookerinput.setOnEditorActionListener(this);
iv_chatlooker_givegift = (ImageView) view.findViewById(R.id.iv_chatlooker_givegift);
iv_chatlooker_givegift.setOnClickListener(this);
initTalk(view);
initGift(view);
isArrive =
ButterKnife.bind(this, view);
private void initTalk(View view) {
container_chatlooker_talkall = (LinearLayout) view.findViewById(R.id.container_chatlooker_talkall);
container_chatlooker_talkall.setVisibility(View.VISIBLE);
@OnClick(R.id.iv_back_givegift_first)
public void hidegiveGift() {
chatlooker_container_givegift.setVisibility(View.GONE);
private void initGift(View view) {
iv_givegift_second_head = (ImageView) view.findViewById(R.id.iv_givegift_second_head);
iv_back_givegift = (ImageView) view.findViewById(R.id.iv_back_givegift);
iv_back_givegift.setOnClickListener(this);
givegift_container_first = (LinearLayout) view.findViewById(R.id.givegift_container_first);
givegift_container_first.setOnClickListener(this);
givegift_container_second = (LinearLayout) view.findViewById(R.id.givegift_container_second);
givegift_container_second.setOnClickListener(this);
tv_goldnum_givegift = (TextView) view.findViewById(R.id.tv_goldnum_givegift);
tv_rechargebtn = (TextView) view.findViewById(R.id.tv_rechargebtn);
tv_rechargebtn.setOnClickListener(this);
tv_givegift_second_name = (TextView) view.findViewById(R.id.tv_givegift_second_name);
tv_givegift_second_goldnum = (TextView) view.findViewById(R.id.tv_givegift_second_goldnum);
btn_givegift_second = (Button) view.findViewById(R.id.btn_givegift_second);
btn_givegift_second.setOnClickListener(this);
btn_chatgift_recharge = (Button) view.findViewById(R.id.btn_chatgift_recharge);
btn_chatgift_recharge.setOnClickListener(this);
tv_giftpop_hot = (TextView) view.findViewById(R.id.tv_giftpop_hot);
tv_giftpop_hot.setOnClickListener(this);
tv_giftpop_all = (TextView) view.findViewById(R.id.tv_giftpop_all);
tv_giftpop_all.setOnClickListener(this);
chatlooker_container_givegift = (LinearLayout) view.findViewById(R.id.chatlooker_container_givegift);
chatlooker_container_givegift.setOnClickListener(this);
rv_chatgift = (RecyclerView) view.findViewById(R.id.rv_chatgift);
rv_chatgift.setLayoutManager(new LinearLayoutManager(rv_chatgift.getContext(), HORIZONTAL, false));
//子布局装饰
rv_chatgift.addItemDecoration(new DividerItemDecoration(getContext(), HORIZONTAL));
//适配器未装填内容
chatGiftAdapter = new ChatGiftAdapter(mycontext, this);
rv_chatgift.setAdapter(chatGiftAdapter);
//滑动加载更多的layout
mSwipeLayout = (VerticalSwipeRefreshLayout) view.findViewById(R.id.swipe_container);
mSwipeLayout.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_blue_bright, android.R.color.holo_blue_bright,
android.R.color.holo_blue_bright);
//需要实现方法
mSwipeLayout.setOnRefreshListener(this);
updateGiftDatas();
//更新赠送礼物的数据
private void updateGiftDatas() {
//查询多条数据
BmobQuery&Gift& query = new BmobQuery&&();
giftdatas = new ArrayList&&();
//判断是否有缓存,该方法必须放在查询条件(如果有的话)都设置完之后再来调用才有效,就像这里一样。
boolean isCache = query.hasCachedResult(mycontext, Gift.class);
if (isCache) {
query.setCachePolicy(BmobQuery.CachePolicy.CACHE_ELSE_NETWORK);
// 如果有缓存的话,则设置策略为CACHE_ELSE_NETWORK
query.setCachePolicy(BmobQuery.CachePolicy.NETWORK_ELSE_CACHE);
// 如果没有缓存的话,则设置策略为NETWORK_ELSE_CACHE
query.findObjects(mycontext, new FindListener&Gift&() {
public void onSuccess(List&Gift& object) {
// TODO Auto-generated method stub
for (Gift bean : object) {
//数据源填充
giftdatas.add(bean);
chatGiftAdapter.setMdatas(giftdatas);
mHandler.sendEmptyMessage(0);
mSwipeLayout.setRefreshing(false);
public void onError(int code, String msg) {
// TODO Auto-generated method stub
mHandler.sendEmptyMessage(0);
mSwipeLayout.setRefreshing(false);
//做成girdview的样式
private void updateUI() {
recyclerView = (ListView) mycontext.findViewById(R.id.rv_chatlooker);
mAdapter = new MyChatMsgAdapter(conversation, mycontext, roomID2);
recyclerView.setAdapter(mAdapter);
public void onRefresh() {
updateFromNet();
if (mAdapter != null) {
mAdapter.refresh();
//从网络中抓取数据,更新UI
private void updateFromNet() {
//点击item的跳转逻辑
赠送礼物跳转
public void onItemClicked(int position) {
// 逻辑 隐藏 及传参
secondShow();
//刷新数据相关
public void setSwipeToRefreshEnabled(boolean enabled) {
mSwipeLayout.setEnabled(enabled);
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
if (mSwipeLayout != null) {
if (mSwipeLayout.isRefreshing()) {
mSwipeLayout.setRefreshing(false);
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
//监听键盘发送功能
sendtalkall = et_chatlooker_lookerinput.getText().toString().trim();
if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
if (TextUtils.isEmpty(sendtalkall)) {
//获取到与聊天人的会话对象。参数username为聊天人的userid或者groupid,后文中的username皆是如此
EMConversation conversation = EMChatManager.getInstance().getConversation(roomID2);
//创建一条文本消息
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
//如果是群聊,设置chattype,默认是单聊
message.setChatType(EMMessage.ChatType.GroupChat);
//设置消息body
TextMessageBody txtBody = new TextMessageBody(sendtalkall);
message.addBody(txtBody);
//设置接收人
message.setReceipt(roomID2);
//把消息加入到此会话对象中
conversation.addMessage(message);
//更新聊天列表消息
//原来的发送消息
mAdapter.refresh();
mAdapter.notifyDataSetChanged();
//发送消息
EMChatManager.getInstance().sendMessage(message, new EMCallBack() {
public void onSuccess() {
public void onError(int i, Stri

我要回帖

更多关于 环信获取所有未读消息 的文章

 

随机推荐