IM实战:Android接入环信 IM SDK
本次学习目标:
注册环信;
Android端集成环信 IM SDK;
实现注册-登录-发送消息-会话列表等;
一、环信IM
- 什么是环信IM
环信IM是一款即时通讯产品,为开发者提供基于移动互联网的即时通讯能力,如单聊、群聊、发语音、发图片、发位置等,让开发者摆脱繁重的移动IM通讯底层开发,24小时即可让App拥有内置IM能力。
- 环信IM可以实现什么?
实现了个人与个人,群组,聊天室发消息,发语音,发图片,发位置等功能,提供了一套供开发者拿来即用的EaseIMKit的ui库;
二、 环信IM实现通讯的基本流程
1、环信账号
a、找到环信im官网,注册一个管理者账号 ,注册地址:https://console.easemob.com/user/register
b、注册成功以后,点击右上角登录 > 登录即时通讯云 ,进入console后台
c、在环信通讯云控制台创建Appkey;
2、Android端接入环信SDK
选择如下任意一种方式将环信即时通讯 IM SDK 集成到你的项目中(以下集成方式只需选择一种,同时使用多种集成方式可能会报错):
方法一:
该方法仅适用于 v3.8.2 或以上版本。
1.在项目的 build.gradle 中添加 mavenCentral()仓库。
buildscript {
repositories {
...
mavenCentral()
}
...
}
allprojects {
repositories {
...
mavenCentral()
}
}
2.在 module 的 build.gradle 中添加如下依赖:
dependencies {
...
// x.y.z 请填写具体版本号,如:3.9.4。
// 可通过 SDK 发版说明获得最新版本号。
implementation 'io.hyphenate:hyphenate-chat:x.x.x'
}
方法二:
手动复制 SDK 文件
打开 SDK 下载页面,获取最新版的环信即时通讯 IM Android SDK,然后解压。
将 SDK 包内 libs 路径下的如下文件,拷贝到你的项目路径下:
3、Android端注册与登录
(1)在主进程中进行初始化:
EMOptions options = new EMOptions();
options.setAppKey("Your appkey");
......// 其他 EMOptions 配置。
EMClient.getInstance().init(context, options);
(2)创建账号
此方法为同步方法,会阻塞当前线程;
此方法只有在开放注册模式下,才能调用。如果此方法报错,请检查下环信管理后台是否是开放注册模式;
// 注册失败会抛出 HyphenateException。
// 同步方法,会阻塞当前线程。
EMClient.getInstance().createAccount(mAccount, mPassword);
(3)登录账号
EMClient.getInstance().login(mAccount, mPassword, new EMCallBack() {
// 登录成功回调
@Override
public void onSuccess() {
}
// 登录失败回调,包含错误信息
@Override
public void onError(final int code, final String error) {
}
@Override
public void onProgress(int i, String s) {
}
});
4、Android端添加好友获取好友列表
(1)添加好友:
// 同步方法,会阻塞当前线程。异步方法为 asyncAddContact(String, String, EMCallBack)。
EMClient.getInstance().contactManager().addContact(toAddUsername, reason);
(2)获取好友列表:
// 从服务器获取好友列表。
// 同步方法,会阻塞当前线程。异步方法为 asyncGetAllContactsFromServer(EMValueCallBack)。
List<String> usernames = EMClient.getInstance().contactManager().getAllContactsFromServer();
// 从本地数据库获取好友列表。
List<String> usernames = EMClient.getInstance().contactManager().getContactsFromLocal();
5、Android端实现发送文本消息
发送一条单聊消息
// `content` 为要发送的文本内容,`toChatUsername` 为对方的账号。
EMMessage message = EMMessage.createTxtSendMessage(content, toChatUsername);
// 发送消息
EMClient.getInstance().chatManager().sendMessage(message);
6、Android端实现接收消息
你可以用注册监听 EMMessageListener 接收消息。
该 EMMessageListener 可以多次添加,请记得在不需要的时候移除 listener,
如在activity 的 onDestroy() 时。
在新消息到来时,你会收到 onMessageReceived 的回调,消息接收时可能是一条,
也可能是多条。你可以在该回调里遍历消息队列,解析并显示收到的消息。
EMMessageListener msgListener = new EMMessageListener() {
// 收到消息,遍历消息队列,解析和显示。
@Override
public void onMessageReceived(List<EMMessage> messages) {
}
};
// 注册消息监听
EMClient.getInstance().chatManager().addMessageListener(msgListener);
// 解注册消息监听
EMClient.getInstance().chatManager().removeMessageListener(msgListener);
7、EaseIMKit 创建聊天列表页面
EaseIMKit 提供了 EaseChatFragment,添加到 Activity 中并传递相应的参数即可用。
必须向 EaseChatFragment 传递的参数为:
conversationId——会话 ID,单聊时指对方 ID,群聊和聊天室时指群和聊天室 ID;
chatType——聊天类型,整型,分别为单聊(1)、群聊(2)和聊天室(3);
可选传递参数为:
history_msg_id——消息 ID,用于查询历史记录时的定位消息 ID;
isRoaming——是否开启漫游,布尔类型,用于标记是否优先从服务器拉取消息。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2)
EaseChatFragment chatFragment = new EaseChatFragment();
Bundle bundle = new Bundle();
bundle.putString(EaseConstant.EXTRA_CONVERSATION_ID, "环信id");
bundle.putInt(EaseConstant.EXTRA_CHAT_TYPE, 1);
chatFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().replace(R.id.container,chatFragment,"chat").commit();
}
8、EaseIMKit 创建会话列表页面
EaseIMKit 提供了 EaseConversationListFragment,需要将其或者其子类添加到
Activity 中。开发者需要对刷新事件(新消息,删除消息,删除会话等)进行处理。
1.加载会话:
public void loadDefaultData() {
presenter.loadData();
}
2.设置数据
public void setData(List<EaseConversationInfo> data) {
presenter.sortData(data);
}
3.删除会话
@Override
public void deleteConversation(int position, EaseConversationInfo info) {
presenter.deleteConversation(position, info);
}
9、EaseIMKit 添加联系人页面
EaseIMKit 提供了 EaseContactListFragment,添加其及其子类到 Activity 中。开发者需要对刷新事件(添加联系人,删除联系人等)进行处理
1.设置数据
public void setData(List<EaseUser> data) {
presenter.sortData(data);
}
到这里我们已经完成了Android端SDK集成,并实现了IM基本功能,相信以各位小伙伴的能力接着的优化完全不是问题,当然也说不定有些奇葩问题搞不定,建议可以去环信官网联系官方技术支持,快速帮你解决遇到的问题~~
环信官网:https://www.easemob.com/
注册环信账号:注册环信即时通讯云
Android端SDK下载:https://www.easemob.com/download/im