====== EaseUI 快速集成(注意:自 V3.7.3 版本 easeUI 停止更新) ======
[EaseIMKit] EaseUI 的升级版 EaseIMKit 正式发布远程依赖库,版本号与 IM SDK 一致,详情请见:[[im:android:other:easeimkit|EaseIMKit 使用指南]]
在您阅读此文档时,我们假定您已经具备了基础的 Android 应用开发经验,并能够理解相关基础概念。此文档是针对导入EaseUI库的快速集成文档,如果只是导入SDK去集成使用,请移步[[http://docs-im.easemob.com/im/android/sdk/import | Android SDK集成]]
=====注册并创建应用=====
注册环信开发者账号并创建后台应用
详细操作步骤见[[http://docs-im.easemob.com/im/quickstart/guide/experience#%E6%B3%A8%E5%86%8C%E5%B9%B6%E5%88%9B%E5%BB%BA%E5%BA%94%E7%94%A8 | 开发者注册及管理后台]]。
Appkey:一个 APP 的唯一标识
IM 用户:一个 appkey 下的唯一标识用户,用来登录环信服务器进行收发消息的用户。 可以在创建好的应用内注册两个 IM 用户(也可以称为环信 id),例如: 账号:user1,密码:123 ; 账号:user2,密码:123,用来通过 SDK 登录环信服务器,收发消息测试。
在环信 Console 后台,点击创建好的应用 → IM 用户 → 创建 IM 用户
{{:im:android:other:easeui快速集成1.jpg?400|}}
建议创建两个 IM 用户,用于后面集成 SDK 之后聊天使用。例如登录 user1 ,在初始化聊天页面时传入 user2 ,user1 给 user2 发消息测试。
{{:im:android:other:easeui快速集成2.jpg?400|}}
===== EaseUI简介 =====
EaseUI是环信提供的UI库,封装了 IM 功能常用的控件、fragment 等等,旨在帮助开发者快速集成环信 SDK。
EaseUI里封装了三个fragment,分别是
* EaseChatFragment – 聊天界面
* EaseConversationFragment – 会话界面
* EaseContactFragment – 通讯录界面
具体了解详见[[http://docs-im.easemob.com/im/android/other/easeui | EaseUI使用指南]]
EaseUI 中用到的第三方库:
* glide-4.7.1:图片处理库,显示用户头像时用到
* BaiduLBS_Android.jar:百度地图的 jar 包,相关 so 还有 libBaiduMapSDK_base_v4_0_0.so、libBaiduMapSDK_map_v4_0_0.so、libBaiduMapSDK_util_v4_0_0.so 及 liblocSDK7.so。如果不用百度可以把这些删除掉,删除掉后项目会报错,修改相应的报错(报错的代码很少,很容易就修改完成)
===== 导入EaseUI =====
从[[http://www.easemob.com/download/im | 环信官网]]点击下载SDK+Demo源码
{{:im:android:other:sdk下载.png?400|}}
下载下来的压缩包解压后内容如下:
{{:im:android:other:sdk目录.png?400|}}
环信的EaseUI位置在examples路径下,与ChatDemoUI3.0平级,内部已经导入了带有实时音视频功能的IM SDK,不需要再去导入。
{{:im:android:other:examples.png?400|}}
打开Android Studio,File--New--Import Module,选中demo路径下的easeui导入。
{{:im:android:other:导入easeui.png?400|}}
等待编译完成,然后将其添加依赖于app module下。
{{:im:android:other:依赖easeui.png?400|}}
===== 配置AndroidManifest.xml =====
在清单文件 AndroidManifest.xml 里加入以下权限,以及写上你注册的 AppKey。
权限配置(实际开发中可能需要更多的权限,可参考 Demo):
适配Android 7.0需在AndroidManifest.xml里配置FileProvider
file_paths.xml内容如下,需将com/hyphenate/chatuidemo替换为你的包名路径
===== 初始化EaseUI =====
在application的onCreate下调用初始化EaseUI的方法。**注**:EaseUi初始化里已包含SDK的初始化,不需要再去调用SDK的初始化。
//EaseUI初始化
if(EaseUI.getInstance().init(context, options)){
//在做打包混淆时,关闭debug模式,避免消耗不必要的资源
EMClient.getInstance().setDebugMode(true);
//EaseUI初始化成功之后再去调用注册消息监听的代码
...
}
===== 登录 =====
//传入在应用(appkey)下注册的IM用户的账号和密码,用于登录环信服务器
EMClient.getInstance().login(userName,password,new EMCallBack() {//回调
@Override
public void onSuccess() {
EMClient.getInstance().groupManager().loadAllGroups();
EMClient.getInstance().chatManager().loadAllConversations();
}
@Override
public void onProgress(int progress, String status) {
}
@Override
public void onError(int code, String message) {
}
});
* 如果在集成调试阶段,可以在初始化环信 SDK 完成之后,就调用登录方法。
* 如果项目上线,建议开发者在登录自己服务器成功之后,再调用环信 SDK 登录方法使用用户绑定的环信id登录环信服务器(开发者给自己用户在自己服务器创建账号的同时,调用环信的 rest 接口在给用户授权注册一个环信 id,一起返回给 app 端,app 端拿到用户的账号密码以及环信 id 密码分别登录自己的服务器以及环信服务器)。
===== 初始化聊天界面 =====
EaseUI里提供的EaseChatFragment可以直接拿来使用,也可创建Fragment去继承EaseChatFragment实现,如:需实现实时音视频通话。可参考demo的ChatFragment。
在项目里创建ChatActivity去加载EaseChatFragment
public class ChatActivity extends BaseActivity {
public static ChatActivity activityInstance;
private EaseChatFragment chatFragment;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.em_activity_chat);
activityInstance = this;
//use EaseChatFratFragment
chatFragment = new EaseChatFragment();
//pass parameters to chat fragment
chatFragment.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add(R.id.container, chatFragment).commit();
}
}
之后就可以通过调用Intent携带聊天对方的环信id跳转ChatActivity实现聊天
Intent intent = new Intent(this, ChatActivity.class);
//username为对方的环信id
intent.putExtra(EaseConstant.EXTRA_USER_ID, username);
startActivity(intent);
===== 集成其他模块 =====
==== 会话列表 ====
需创建Fragment去继承EaseConversationFragment实现点击item跳转聊天界面,可参考demo的ConversationListFragment
conversationListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
EMConversation conversation = conversationListView.getItem(position);
String username = conversation.conversationId();
if (username.equals(EMClient.getInstance().getCurrentUser()))
Toast.makeText(getActivity(), R.string.Cant_chat_with_yourself, Toast.LENGTH_SHORT).show();
else {
// start chat acitivity
Intent intent = new Intent(getActivity(), ChatActivity.class);
if(conversation.isGroup()){
if(conversation.getType() == EMConversationType.ChatRoom){
// it's group chat
intent.putExtra(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_CHATROOM);
}else{
intent.putExtra(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_GROUP);
}
}
// it's single chat
intent.putExtra(EaseConstant.EXTRA_USER_ID, username);
startActivity(intent);
}
}
});
==== 好友列表 ====
好友列表同会话列表一样,都需要创建Fragment去继承EaseContactListFragment实现点击item跳转
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
EaseUser user = (EaseUser)listView.getItemAtPosition(position);
if (user != null) {
String username = user.getUsername();
// demo中直接进入聊天页面,实际一般是进入用户详情页
startActivity(new Intent(getActivity(), ChatActivity.class).putExtra("userId", username));
}
}
});
好友列表还需要去设置数据,通过调用setContactsMap(m)去设置,数据需要是Map格式的,key是环信id。
**注**:会话列表和好友列表都需要对应的Activity来加载,也可以都加载在同一个activity里,然后根据导航栏的点击来切换,譬如环信的demo那样。
===== 集成实时音视频通话 =====
实时音视频通话这块在EaseUI里是没有实现的,需要在项目里自行实现。可以直接从demo中去copy相关的类来快速实现。
首先需要在初始化之后去注册通话广播接收者,来监听通话请求。
IntentFilter callFilter = new IntentFilter(EMClient.getInstance().callManager().getIncomingCallBroadcastAction());
if(callReceiver == null){
callReceiver = new CallReceiver();
}
//register incoming call receiver
appContext.registerReceiver(callReceiver, callFilter);
CallReceiver代码如下
public class CallReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(!DemoHelper.getInstance().isLoggedIn())
return;
//username
String from = intent.getStringExtra("from");
//call type
String type = intent.getStringExtra("type");
if("video".equals(type)){ //video call
context.startActivity(new Intent(context, VideoCallActivity.class).
putExtra("username", from).putExtra("isComingCall", true).
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}else{ //voice call
context.startActivity(new Intent(context, VoiceCallActivity.class).
putExtra("username", from).putExtra("isComingCall", true).
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
EMLog.d("CallReceiver", "app received a incoming call");
}
}
接着将demo中的VideoCallActivity、VoiceCallActivity、CallActivity以及它们需要的文件到copy过来。
然后在ChatFragment中registerExtendMenuItem方法中添加发起音视频通话的图标,实现对应的点击事件--携带参数跳转通话界面。
//视频通话就是跳转VideoCallActivity
startActivity(new Intent(getActivity(), VoiceCallActivity.class).putExtra("username", toChatUsername)
.putExtra("isComingCall", false));
可参考demo的ChatFragment。