一、Android SDK简介
环信SDK为用户开发IM相关的应用提供的一套完善的开发框架。 包括以下几个部分:
- SDK_Core为核心的消息同步协议实现,完成与服务器之间的信息交换。
- SDK是基于核心协议实现的完整的IM功能,实现了不同类型消息的收发、会话管理、群组、好友、聊天室等功能。
- EaseUI是一组IM相关的UI控件,旨在帮助开发者快速集成环信SDK。
SDK采用模块化设计,每一模块的功能相对独立和完善,用户可以根据自己的需求选择使用下面的模块:
- EMClient: SDK的入口,主要完成登录、退出、连接管理等功能。也是获取其他模块的入口。
- EMChatManager: 管理消息的收发,完成会话管理等功能。
- EMContactManager: 负责好友的添加删除,黑名单的管理。
- EMGroupManager: 负责群组的管理,创建、删除群组,管理群组成员等功能。
- EMChatroomManager: 负责聊天室的管理。
二、Android SDK集成
集成前准备:注册并创建应用
- 注册环信开发者账号:
- 在环信官网上点击“即时通讯云”,并点击“免费使用”,跳转到环信管理后台注册页面。
- 在注册页面中填写详细资料,企业ID:只限于数字、字母、横线,且不能以横线开头和结尾。企业ID会存在于生成的AppKey中。如:测试Demo中AppKey为easemob-demo#chatdemo,则easemob-demo为填写的企业ID。
注:如果是个人应用开发的话,企业ID直接写成自己定义的ID就可以。 - 点击注册。注册成功后,我们会向您填写的邮箱中发送验证信息,请前往邮箱进行账号激活。
- 创建应用:
- 账号激活成功后,回到控制台登录页面登录到开发者后台,在我的应用中,点击创建应用按钮。
- 填写创建应用的名称(内容只限于数字、大小写字母),(应用名称会存在于你生成的AppKey中,如:测试Demo中AppKey为easemob-demo#chatdemo,则chatdemo为填写的应用名称。注册授权根据需要自行选择。)
- 填写好应用名称后,点确定。创建成功,系统会为你生成AppKey以及相关配置信息。
之后我们需要将AppKey配置到工程里。
- 注册环信开发者账号:
下载SDK :到环信官网下载环信SDK。
SDK目录讲解:从官网下载的SDK目录包含了4个文件夹,如下:
- doc文件夹:SDK相关API文档
- examples文件夹:ChatDemoUI(老的Demo,不推荐使用)、ChatDemoUI3.0(3.0Demo依赖EaseUI库)、EaseUI
- libs文件夹:包含IM和实时音视频功能所需要的jar和so文件
- libs.without.audio文件夹:无实时语音、实时视频功能的SDK包,如果项目中只用到聊天功能,可以把项目里的jar和so文件替换成此文件夹里的
第三方类库介绍:
- SDK中用到的第三方库:
- android-support-v4.jar:这个可以说是每个APP中都是不可缺少的jar包,这里不多赘述
- google-play-services.jar:GCM(Google云消息传递)的jar包,不需要GCM推送可以删除
- MiPush_SDK_Client_2_2_19.jar:小米推送的jar包,不需要可以删除
- org.apache.http.legacy.jar:Android6.0中默认移除了httpclient的代码,用这个库兼容,建议不要删除,否则在6.0系统中,SDK会有问题
- EaseUI中用到的第三方库:
- glide-3.6.1.jar:图片处理库,显示用户头像时用到
- BaiduLBS_Android.jar:百度地图的jar包,相关so还有libBaiduMapSDK_base_v3_6_1.so、libBaiduMapSDK_map_v3_6_1.so、libBaiduMapSDK_util_v3_6_1.so及liblocSDK6a.so。如果不用百度可以把这些删除掉,删除掉后项目会报错,修改相应的报错(报错的代码很少,很容易就修改完成)
- Demo中用到的第三方库:
- android-support-multidex.jar:APP总方法数超过64k时,需要用这个库做分包处理,可以删除
- 其他的不再进行介绍
- SDK中用到的第三方库:
- 配置工程:
- 导入SDK:在自行开发的应用中,集成环信聊天需要把libs文件夹下的jar及so文件复制到你的项目的libs文件夹相应位置,如果不需要语音和视频通话功能,导入libs.without.audio下的文件即可。
- 配置信息:在清单文件AndroidManifest.xml里加入以下权限,以及写上你注册的AppKey。
- APP打包混淆: 在ProGuard文件中加入以下keep。
-keep class com.hyphenate.* { ;}
-dontwarn com.hyphenate.**
注:清单文件的配置示例
<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.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" />
<!-- 设置环信应用的AppKey -->
<meta-data android:name="EASEMOB_APPKEY" android:value="Your AppKey" />
<!-- 声明SDK所需的service SDK核心功能-->
<service android:name="com.hyphenate.chat.EMChatService" android:exported="true"/>
<!-- 声明SDK所需的receiver -->
<receiver android:name="com.hyphenate.chat.EMMonitorReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
<!-- 可选filter -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
三、SDK 中相关异步/同步处理方法介绍
- 同步方法:SDK里大部分方法都为同步方法,即这个方法执行完毕,才会走后面的代码。
- 异步方法:带有callback以及API注释里明确写明异步方法的方法,即不需要等这个方法走完,后边的代码就已经在执行了,通过callback得到方法执行的结果。
注:具体是异步还是同步,也可以参考相关文档介绍的方法,每一个方法后边都有注释信息提示开发者,未注释的则认为同步执行。
四、初始化SDK
要求在application的oncreate方法中做初始化,初始化的时候需要传入设置好的options。
EMOptions options = new EMOptions();
// 默认添加好友时,是不需要验证的,改成需要验证
options.setAcceptInvitationAlways(false);
...
//初始化
EMClient.getInstance().init(applicationContext, options);
//在做打包混淆时,关闭debug模式,避免消耗不必要的资源
EMClient.getInstance().setDebugMode(true);
注:如果你的APP中有第三方的服务启动,请在初始化SDK(EMClient.getInstance().init(applicationContext, options))方法的前面添加以下相关代码(相应代码也可参考Demo的application),使用EaseUI库的就不用理会这个。
appContext = this;
int pid = android.os.Process.myPid();
String processAppName = getAppName(pid);
// 如果APP启用了远程的service,此application:onCreate会被调用2次
// 为了防止环信SDK被初始化2次,加此判断会保证SDK被初始化1次
// 默认的APP会在以包名为默认的process name下运行,如果查到的process name不是APP的process name就立即返回
if (processAppName == null ||!processAppName.equalsIgnoreCase(appContext.getPackageName())) {
Log.e(TAG, "enter the service process!");
// 则此application::onCreate 是被service 调用的,直接返回
return;
}
如何获取processAppName请参考以下方法。
private String getAppName(int pID) {
String processName = null;
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);