Android SDK 介绍及导入
DEMO(EaseIM App) 体验
下载地址:下载页
Android SDK 介绍
环信 SDK 为用户开发 IM 相关的应用提供的一套完善的开发框架。包括以下几个部分:
- SDK_Core 为核心的消息同步协议实现,完成与服务器之间的信息交换。
- SDK 是基于核心协议实现的完整的 IM 功能,实现了不同类型消息的收发、会话管理、群组、好友、聊天室等功能。
- EaseUI 是一组 IM 相关的 UI 控件,旨在帮助开发者快速集成环信 SDK。
开发者可以基于 EaseUI 或者环信 SDK 开发自己的应用,前者因为把消息的发送接送等功能封装到了内部,集成时开发者不需要太关心消息是怎么发送、怎么接收等逻辑。请查阅EaseUI使用指南。
SDK 采用模块化设计,每一模块的功能相对独立和完善,用户可以根据自己的需求选择使用下面的模块:
- EMClient: SDK 的入口,主要完成登录、退出、连接管理等功能。也是获取其他模块的入口。
- EMChatManager: 管理消息的收发,完成会话管理等功能。
- EMContactManager: 负责好友的添加删除,黑名单的管理。
- EMGroupManager: 负责群组的管理,创建、删除群组,管理群组成员等功能。
- EMChatroomManager: 负责聊天室的管理。
注意:如果您是从 SDK2.x 升级到 3.0,可以参考环信 SDK2.x 到 3.0 升级文档。
视频教程
以下是SDK集成参考视频,您可以通过视频学习如何集成环信SDK。
Android SDK 导入
集成前准备
手动复制jar包及so导入
到环信官网下载环信 SDK。
考虑到开发者需求不一样,在下载的 SDK 中,提供了两个不同的文件夹:
- libs.av 文件夹里是带实时语音功能和实时视频功能的 jar 包和 so 文件。
- 如果你不需要实时语音、实时视频功能,那就直接用 libs.lite 文件夹下的 jar 包及 so 文件。
通过gradle远程链接导入
首先在你的项目根目录build.gradle
文件的allprojects→repositories
属性下加入远程库地址
repositories {
google()
jcenter()
maven { url 'http://developer.huawei.com/repo'} //如果需要使用华为推送HMS,则需要加上此句
}
然后在你的module的build.gradle
里加入以下代码
android {
//use legacy for android 6.0(3.6.8版本之后移除apache library)
//useLibrary 'org.apache.http.legacy'
//自3.6.0开始需要java8的支持
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
//其他必要依赖
......
api 'com.hyphenate:hyphenate-sdk:xxx版本号'
}
如果想使用不包含音视频通话的sdk,用api 'com.hyphenate:hyphenate-sdk-lite:xxx版本号
';
SDK版本号参考Release Note
SDK 目录讲解
从官网上下载下来的包,解压后内容如下:
在这里主要介绍后面四个文件夹内容:
- doc 文件夹:SDK 相关 API 文档
- examples 文件夹:EaseIm3.0
- libs.av 文件夹:包含IM和实时音视频功能所需要的 jar 和 so 文件
- libs.lite 文件夹:无实时语音、实时视频功能的 SDK 包,如果项目中只用到聊天功能,可以把项目里的 jar 和 so 文件替换成此文件夹里的文件
第三方库介绍
SDK 中用到的第三方库
- android-support-v4.jar:这个可以说是每个 APP 中都是不可缺少的 jar 包,这里不多赘述
- org.apache.http.legacy.jar:在3.6.8版本以后SDK移除了这个jar包;在3.6.8之前的版本用这个库兼容,建议不要删除,否则在 6.0 系统中,SDK 会有问题
EaseIMKit 中用到的第三方库
- glide-4.9.0:图片处理库,显示用户头像时用到
- 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。依赖本地EaseIMKit库时,如果不用百度可以把这些删除掉,删除掉后项目会报错,修改相应的报错(报错的代码很少,很容易就修改完成)
配置工程
导入 SDK
在自行开发的应用中,集成环信聊天需要把 libs 文件夹下的 jar 及 so 文件复制到你的项目的 libs 文件夹相应位置,如果不需要语音和视频通话功能,导入libs.lite 下的文件即可。
配置信息
在清单文件 AndroidManifest.xml 里加入以下权限,以及写上你注册的 AppKey。
权限配置(实际开发中可能需要更多的权限,可参考 Demo):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="Your Package"
android:versionCode="100"
android:versionName="1.0.0">
<!-- IM SDK required start -->
<!-- 允许程序振动 -->
<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.WRITE_EXTERNAL_STORAGE"/>
<!-- 这个权限用于访问GPS定位(用于定位消息,如果不用定位相关可以移除) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- api 21后被标记为deprecated -->
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- 用于访问wifi网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 用于获取wifi的获取权限 -->
<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" />
<!-- 捕获屏幕所需权限,Q后新增权限(多人音视频屏幕分享使用) -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<!-- IM SDK required end -->
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:name="Your Application">
<!-- 设置环信应用的AppKey -->
<meta-data android:name="EASEMOB_APPKEY" android:value="Your AppKey" />
<!-- 声明SDK所需的service SDK核心功能-->
<service android:name="com.hyphenate.chat.EMChatService" android:exported="true"/>
<service android:name="com.hyphenate.chat.EMJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
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>
</application>
</manifest>
关于 EASEMOB_APPKEY 对应的 value 获取,在创建应用后,申请 AppKey 并进行相关配置。
如果对生成的apk大小比较敏感,我们建议使用jar方式,并且手工拷贝so,而不是使用Aar,因为Aar方式会把各个平台的so文件都包含在其中。采用jar方式,可以仅保留一个ARCH目录。如果使用lite版,建议仅保留armeabi;如果使用音视频版,建议仅保留armeabi-v7a。这样虽然在对应平台执行的速度会降低,但是能有效减小apk的大小。
常见问题汇总
1. 用户集成 SDK 后使用 HttpClient 报错
建议将SDK升级到3.6.8以上版本,SDK3.6.8以后版本移除了apache library。
3.6.8版本之前的版本请按照下面进行配置:
- Android 6.0及以上版本需要在module-level/build.gradle
android block中添加:
android {
//use legacy for android > 6.0
useLibrary 'org.apache.http.legacy'
}
- Android 9.0还需在AndroidManifest.xml
的application
标签中添加:
<application>
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
</application>
2. Android 9.0上强制使用https的问题
表现:会出现出现UnknownServiceException: CLEARTEXT communication to localhost not permitted by network security policy
或者IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
报错
解决办法可以参考:StackOverFlow,也可以直接在AndroidManifest.xml
文件的application
标签中设置android:usesCleartextTraffic=“true”
<application
android:usesCleartextTraffic="true" >
</application>
3. 升级到AndroidX且使用3.7.3版本以上SDK报找不到LocalBroadcastManager的问题
报错详情如下:
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/localbroadcastmanager/content/LocalBroadcastManager;
at com.hyphenate.chat.core.EMAdvanceDebugManager.h(Unknown Source:13)
at com.hyphenate.chat.core.EMAdvanceDebugManager.a(Unknown Source:2)
at com.hyphenate.chat.EMClient.onNewLogin(Unknown Source:62)
at com.hyphenate.chat.EMClient$7.run(Unknown Source:197)
......
Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.localbroadcastmanager.content.LocalBroadcastManager" on path: DexPathList[[zip file "/data/app/com.hyphenate.easeim-3yS1c2quwGEzgNmhDyf7dA==/base.apk"],nativeLibraryDirectories=[/data/app/com.hyphenate.easeim-3yS1c2quwGEzgNmhDyf7dA==/lib/arm64, /data/app/com.hyphenate.easeim-3yS1c2quwGEzgNmhDyf7dA==/base.apk!/lib/arm64-v8a, /system/lib64, /product/lib64]]
......
at com.hyphenate.chat.core.EMAdvanceDebugManager.h(Unknown Source:13)
at com.hyphenate.chat.core.EMAdvanceDebugManager.a(Unknown Source:2)
at com.hyphenate.chat.EMClient.onNewLogin(Unknown Source:62)
at com.hyphenate.chat.EMClient$7.run(Unknown Source:197)
......
解决办法:
在项目中添加如下依赖:
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
APP 打包混淆
在 ProGuard 文件中加入以下 keep。
-keep class com.hyphenate.** {*;}
-dontwarn com.hyphenate.**
//3.6.8版本之后移除apache,无需再添加
-keep class internal.org.apache.http.entity.** {*;}
//如果使用了实时音视频功能
-keep class com.superrtc.** {*;}
-dontwarn com.superrtc.**
上一章节:服务端集成
下一页:Android SDK 基础功能