首先登陆www.easemob.com 熟悉下,然后点击下载,下载sdk.里面包含了,uidemo和sdk
下载后显示
libs中含有jar包,easemobchat_2.0.4 把这个包放入到项目的libs中
添加AndroidMinifest权限
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />
<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />
里面有位置发送,用到了百度地图,所以需要有百度地图的权限
在Application下需要添加
<!-- 开机自启动服务 -->
<receiver android:name="com.easemob.chat.StartServiceReceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
<!-- 设置环信应用的appkey -->
<meta-data
android:name="EASEMOB_APPKEY"
android:value="easemob-demo#chatdemoui" />
<!-- 声明sdk所需的service -->
<service android:name="com.easemob.chat.EMChatService" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />
简单对上面需要加的解释下:
开机启动,即手机开机会自动登录开启后台Service,为了能够更好的收到消息
环信应用的AppKey,是从环信平台获取到的Appkey,怎样从环信平台获取Appkey,后面会讲。
在Android的Application类中需要加入的代码如下
// 初始化环信SDK,一定要先调用init()
Log.d("EMChat Demo", "initialize EMChat SDK");
EMChat.getInstance().init(applicationContext);
// debugmode设为true后,就能看到sdk打印的log了
EMChat.getInstance().setDebugMode(true);
简单解释下上面的代码,init方法是环信sdk需要的初始化,setDebugMode 这个方法设置为true可以看到sdk暴露出来的很多日志,便于开发者判断错误原因,建议发布程序时,改为false
下面在登录自己服务器的时候也到登录环信服务器,所以,环信服务器登录的方法如下:
// 调用sdk登陆方法登陆聊天服务器
EMChatManager.getInstance().login(username, password, new EMCallBack() {
@Override
public void onSuccess() {
}
@Override
public void onProgress(int progress, String status) {
}
@Override
public void onError(int code, final String message) {
}
登录成功后,可以获取自己的好友,
List<String> usernames = EMChatManager.getInstance().getContactUserNames();
可以根据username再次扩展更多的属性,比如服务端加个接口,根据用户名获取用户的详细信息,例如:gender,address,mobile等。最后保存到数据库中
可以获取自己的群组:
EMGroupManager.getInstance().getGroupsFromServer();
好了,环境配置好了,也登录获取到数据了,现在就要测试聊天了,
在App的主界面例如MainActivity 这里就要收到消息提醒和消息了。
接受消息就需要添加消息的广播
现在看下UIDemo怎么做的;
// 注册一个接收消息的BroadcastReceiver
msgReceiver = new NewMessageBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction());
intentFilter.setPriority(3);
registerReceiver(msgReceiver, intentFilter);
// 注册一个ack回执消息的BroadcastReceiver
IntentFilter ackMessageIntentFilter = new IntentFilter(EMChatManager.getInstance()
.getAckMessageBroadcastAction());
ackMessageIntentFilter.setPriority(3);
registerReceiver(ackMessageReceiver, ackMessageIntentFilter);
上面代码注册了两个广播,第一个msgReceiver,这个是为了收到消息
而下面那个呢,看注册,哦,应该是回执,即对方是否消息已读,如果需要返回这个状态就增加这个广播,当然,这个广播也不是必须的,但上面那个是必须的否则会收不到消息
好吧,看看还需要什么:
// setContactListener监听联系人的变化等
EMContactManager.getInstance().setContactListener(new MyContactListener());
// 注册一个监听连接状态的listener
EMChatManager.getInstance().addConnectionListener(new MyConnectionListener());
// 注册群聊相关的listener
EMGroupManager.getInstance().addGroupChangeListener(new MyGroupChangeListener());
// 通知sdk,UI 已经初始化完毕,注册了相应的receiver和listener, 可以接受broadcast了
EMChat.getInstance().setAppInited();
监听联系人的变化:例如:联系人的添加,删除等;
监听连接状态:这个挺重要的。在线或者掉线了,都有监听,可对其进行其他的操作,例子中还举例了,踢人,即移动端不支持同一账号登陆,会被踢掉。
这个还是很多App有这样的功能的,不过环信还有webim,经测试可以在web端和手机端同时登陆一个账号。
在监听到具体信息后,可以做更新下标(几条未读消息)等操作,具体代码请看uidemo,
在聊天界面ChatActivity中,获取某个用户的所有会话,方法为
EMChatManager.getInstance().getConversation(username); 返回类型为EMConversation
conversation.getMsgCount()获取消息的数量;
conversation.getMessage(position) 获取到这条消息
message.direct == EMMessage.Direct.RECEIVE 根据message.direct能够知道这个消息是发送回去的,还是接收到的
ChatType chatType = message.getChatType(); chatType != ChatType.GroupChat 根据ChatType可以判断是单聊还是群聊
这个类里面也添加了一个NewMessageBroadcastReceiver消息监听,可以在收到消息时刷新列表
ackMessageReceiver 已读回执监听,能够及时获取到是否对方已读;
仔细观察会发现监听中有个abortBroadcast();方法,这个方法是为了不让MainActivity和ChatActivity中监听重复,执行后终止监听。
才看这个demo有一些疑惑,不知道这个消息的发送在哪里,ChatActivity中没有体现啊,
其实这个发送消息用了另一种特别好的方案,消息发送在MessageAdapter里面,看下面代码
switch (message.getType()) { // 根据消息type显示item case IMAGE: handleImageMessage(message, holder, position, convertView); break; case TXT: handleTextMessage(message, holder, position); break; case LOCATION: handleLocationMessage(message, holder, position, convertView); break; case VOICE: handleVoiceMessage(message, holder, position, convertView); break; case VIDEO: handleVideoMessage(message, holder, position, convertView); break; default: // not supported }
这几个方法判断了,是否哪种消息类型。和具体发送方法,判断是这样的,以发消息举例
/** * 文本消息 * * @param message * @param holder * @param position */ private void handleTextMessage(EMMessage message, ViewHolder holder, final int position) { TextMessageBody txtBody = (TextMessageBody) message.getBody(); Spannable span = SmileUtils.getSmiledText(context, txtBody.getMessage()); holder.tv.setText(span, BufferType.SPANNABLE); holder.tv.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { activity.startActivityForResult( (new Intent(activity, ContextMenu.class)).putExtra("position", position).putExtra("type", EMMessage.Type.TXT.ordinal()), ChatActivity.REQUEST_CODE_CONTEXT_MENU); return true; } }); if (message.direct == EMMessage.Direct.SEND) { switch (message.status) { case SUCCESS: holder.pb.setVisibility(View.GONE); holder.staus_iv.setVisibility(View.GONE); break; case FAIL: holder.pb.setVisibility(View.GONE); holder.staus_iv.setVisibility(View.VISIBLE); break; case INPROGRESS: break; default: sendMsgInBackground(message, holder); } } }
代码就是上面那个,判断如果是发送方,检测发送失败还是成功,未发送则调用sendMsgInBackground这个方法才是真的发送。
这样做有什么好处呢,个人认为:当你的消息发送一般,手机重启或者App被kill掉,让再次运行这个软件的时候,进入这个列表,列表中的信息会重新帮你发送出去,不用再次填写,至于是不是这个原因,均属我个人看法。
集成差不多了,需要Appkey和账号哪里取?