本文介绍如何使用 ZIM SDK 快速实现基本的单聊会话消息收发功能。
在使用 ZIM SDK 前,请确保开发环境满足以下要求:
2.3.0 及以上
版本的 SDK,开始支持 “AppSign 鉴权”,同时仍支持 “Token 鉴权”,若您需要升级鉴权方式,可参考 ZIM 如何从 AppSign 鉴权升级为 Token 鉴权。
打开 Android Studio,选择 “File > New > New Project” 菜单。
填写项目名及项目存储路径。
其它按照默认设置,单击 “Next”,最后单击 “Finish” 完成新工程创建。
目前支持的平台架构包括:armeabi-v7a、arm64-v8a、x86、x86_64。
开发者可通过以下任意一种方式实现集成 SDK。
配置 repositories 源
当您的 Android Gradle Plugin 为 v7.1.0 或以上版本:进入项目根目录,打开 “settings.gradle” 文件,在 “dependencyResolutionManagement” 中加入如下代码。
...
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
maven { url 'https://storage.zego.im/maven' }
mavenCentral()
google()
}
}
如果您在 “settings.gradle” 中找不到上述字段,可能是因为您的 Android Gradle Plugin 版本低于 v7.1.0。
若您的 Android Gradle Plugin 为 v7.1.0 以下版本:进入项目根目录,打开 “build.gradle” 文件,在 “allprojects” 中加入如下代码。
...
allprojects {
repositories {
maven { url 'https://storage.zego.im/maven' }
mavenCentral()
google()
}
}
声明依赖
进入 “app” 目录,打开 “build.gradle” 文件,在 “dependencies” 中添加 implementation 'im.zego:zim:x.y.z'
,请从 发布日志 查询 SDK 最新版本,并将 x.y.z
修改为具体的版本号。
...
dependencies {
...
implementation 'im.zego:zim:x.y.z'
}
请参考 下载 SDK,下载最新版本的 SDK。
将 SDK 包解压至项目目录下,例如 “app/libs”。
添加 SDK 引用。进入到 “app” 目录,打开 “build.gradle” 文件。
在 “defaultConfig” 节点添加 “ndk” 节点,指定支持的架构。
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
在 “android” 节点添加 “sourceSets” 节点,指定 “libs” 所在目录。
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
在 “dependencies” 节点引入 “libs” 下所有的 jar。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
......
}
开发者可以根据实际应用需要,设置应用所需权限。
进入 “app/src/main” 目录,打开 “AndroidManifest.xml” 文件,添加权限。
<!-- SDK 必须使用的权限 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在 “proguard-rules.pro” 文件中,为 SDK 添加 -keep
类的配置,防止混淆 SDK 公共类名称。
-keep class **.zego.**{*;}
以下流程中,我们以客户端 A 和 B 的消息交互为例:
请参考 跑通示例源码 获取源码,相关功能的源码请查看 “app/src/main/java/im/zego/zimexample/ui/chat/peer/ZIMPeerChatActivity.java” 目录下的文件。
在项目文件中引入类文件。
import im.zego.zim.ZIM;
首先我们需要在 SDK 中创建 ZIM 实例,一个实例对应的是一个用户,表示一个用户以客户端的身份登录系统。
例如,客户端 A、B 分别调用 create 接口,传入在 1 前提条件 中获取到的 AppID、AppSign,创建了 A、B 的实例:
// 创建 ZIM 对象,传入 appID、appSign 与 Android 中的 Application
// 请注意:ZIM 从 2.3.0 版本开始支持 AppSign 鉴权,SDK 也默认为 AppSign 鉴权,如果您需要切换鉴权方式:
// (1) 2.3.3 及以上版本的 SDK,支持鉴权方式的自主切换; (2) 2.3.0 ~ 2.3.1 版本的 SDK,需要切换为 “Token 鉴权” 时,请联系 ZEGO 技术支持处理
ZIMAppConfig appConfig = new ZIMAppConfig();
appConfig.appID = 12345; //替换为您申请到的 AppID
appConfig.appSign = "appSign"; //替换为您申请到的 AppSign
zim = ZIM.create(appConfig, application);
由于大多数开发者,在整个流程中,只需要将 ZIM 实例化一次,因此 ZEGO 建议您将 ZIM 单例化并保存。
创建一个 SDKManager 类,在该类中声明并实现了一个 “sharedInstance” 静态方法,该方法将会在首次调用时创建并返回一个 SDKManager 的对象,在该对象中调用 ”create“,此后在项目的任意位置导入 SDKManager 类,调用 “SDKManager.sharedInstance().zim” 将会返回 zim 对象。
public class SDKManager {
private static SDKManager sdkManager;
public ZIM zim;
public static SDKManager sharedInstance() {
if (sdkManager == null) {
synchronized (SDKManager.class) {
if (sdkManager == null) {
sdkManager = new SDKManager();
}
}
}
return sdkManager;
}
public void create(Application application) {
zim = ZIM.create(ZegoAppID.appID, application);
}
}
在客户端登录前,开发者可以通过调用 setEventHandler 接口,自定义 ZIM 中的事件回调,接收到 SDK 异常、消息通知回调等的通知。
zim.setEventHandler(new ZIMEventHandler() {
@Override
public void onReceivePeerMessage(ZIM zim, ArrayList<ZIMMessage> messageList, String fromUserID) {
// 收到“单聊”通信的消息回调
}
});
详细的接口介绍,请参考 onReceivePeerMessage、onReceiveGroupMessage、onReceiveRoomMessage。
创建实例后,客户端 A 和 B 需要登录 ZIM,只有登录成功后才可以开始发送、接收消息、更新 Token 等。
客户端需要使用各自的用户信息进行登录。调用 login 接口,传入用户信息 ZIMUserInfo 对象,进行登录。
2.3.0
或以上版本的 SDK,默认鉴权方式为 “AppSign 鉴权”,登录 ZIM 时只需传入 ZIMUserInfo、Token 传入空字符串即可。// userID 最大 32 字节的字符串。仅支持数字,英文字符 和 '!', '#', '$', '%', '&', '(', ')', '+', '-', ':', ';', '<', '=', '.', '>', '?', '@', '[', ']', '^', '_', '{', '}', '|', '~'。
// userName 最大 256 字节的字符串,无特殊字符限制。
ZIMUserInfo zimUserInfo = new ZIMUserInfo();
zimUserInfo.userID = userID;
zimUserInfo.userName = userName;
// 登录时:
// 使用 Token 鉴权,需要开发者填入 "使用 Token 鉴权" 文档生成的 Token,详情请参考 [使用 Token 鉴权]
// 使用 AppSign 鉴权 (2.3.0 或以上版本的默认鉴权方式),Token 参数填空字符串
zim.login(zimUserInfo, new ZIMLoggedInCallback() {
@Override
public void onLoggedIn(ZIMError error) {
// 开发者可根据 ZIMError 来判断是否登录成功。
}
});
客户端 A 登录成功后,可以向客户端 B 发送消息。
目前 ZIM 支持的消息类型如下:
消息类型 | 说明 | 特性及适用场景 |
---|---|---|
ZIMTextMessage(1) |
文本消息。消息大小不超过 32 KB,单个客户端发送频率限制为 10 次/秒。 |
消息可靠有序,可存储为历史消息(保存时间请参考 计费说明 - 版本说明 中“历史消息存储天数”。);一般适用于“单聊”、“群聊”等即时聊天的场景和“房间聊天”的公屏聊天场景。房间解散后,“房间聊天”的消息不存储。
相关接口:sendMessage |
ZIMCommandMessage(2) |
开发者可自定义数据内容的信令消息。消息大小不超过 5 KB,单个客户端发送频率限制为 10 次/秒。 |
支持更高的并发;一般适用于“语聊房”、“在线课堂”等房间内的信令传输,比如上下麦操作、送礼物,发送在线课堂课件等。
相关接口:sendMessage |
ZIMBarrageMessage(20) |
房间内弹幕文本消息。消息大小不超过 5 KB,单个客户端发送频率无限制。 |
专门用于房间内的高频、不可靠、允许丢掉的消息,一般适用于发送“弹幕消息”的场景中。 支持高并发,但不可靠,不保证消息送达。 相关接口:sendMessage |
ZIMImageMessage(11) |
图片消息。支持主流图片格式,包括 JPG、PNG、BMP、TIFF、GIF、WebP,大小不超过 10 MB,单个客户端发送频率限制为 10 次/秒。 |
消息可靠有序,可存储为历史消息(保存时间请参考 计费说明 - 版本说明 中“历史消息存储天数”。);一般用于单聊、房间、群聊等即时聊天场景。
相关接口: sendMediaMessage |
ZIMFileMessage(12) |
文件消息。消息内容为文件,格式不限,大小不超过 100 MB,单个客户端发送频率限制为 10 次/秒。 |
|
ZIMAudioMessage(13) |
语音消息。支持 MP3、M4A 格式的语音文件,时长不超过 300 秒,大小不超过 6 MB,单个客户端发送频率限制为 10 次/秒。 |
|
ZIMVideoMessage(14) |
视频消息。支持 MP4、MOV 格式的视频文件,大小不超过 100 MB,单个客户端发送频率限制为 10 次/秒。仅支持视频编码格式为 H264 和 H265 的视频文件在消息发送成功后获取该视频首帧的宽、高信息。 |
|
ZIMCombineMessage(100) |
合并消息,消息大小无限制,单个客户端发送频率限制为 10 次/秒。 |
消息可靠有序,可存储为历史消息(保存时间请参考 计费说明 - 版本说明 中“历史消息存储天数”。);一般用于单聊、房间、群聊等即时聊天场景。
相关接口:sendMessage |
ZIMCustomMessage(200) |
自定义消息。开发者可自定义消息的类型,并自行完成消息的解析,ZIM SDK 不负责定义和解析自定义消息的具体内容。 |
一般可用于发送投票类型、接龙类型、视频卡片类型等消息。
相关接口: sendMessage |
以下为发送单聊文本消息
为例:客户端 A 可以调用 sendMessage 接口,传入客户端 B 的 userID、消息内容、消息类型 ZIMConversationType,即可发送一条文本消息
到 B 的客户端。
// 以下为单聊场景
// conversationID 为 消息需要发送的会话 ID
// 单聊时,conversationID 即是对方的 userID;群组时,conversationID 即是群组的 groupID;房间时,conversationID 即是房间的 roomID
String conversationID = "xxxx";
ZIMTextMessage zimMessage = new ZIMTextMessage();
zimMessage.message = "消息内容";
ZIMMessageSendConfig config = new ZIMMessageSendConfig();
// 消息优先级,取值为 低:1 默认,中:2,高:3
config.priority = ZIMMessagePriority.LOW;
// 设置消息的离线推送配置
ZIMPushConfig pushConfig = new ZIMPushConfig();
pushConfig.title = "离线推送的标题";
pushConfig.content= "离线推送的内容";
pushConfig.payload = "离线推送的扩展信息";
config.pushConfig = pushConfig;
// 在单聊场景中,ZIMConversationType 设置为 PEER
zim.sendMessage(zimMessage, conversationID, ZIMConversationType.PEER,config, new ZIMMessageSentCallback() {
@Override
public void onMessageAttached(ZIMMessage zimMessage){
// 发送前的回调,客户可以在这里获取一个临时对象,该对象与开发者创建的 zimMessage 对象属于同一对象,开发者可利用此特性做一些业务逻辑,如提前展示 UI 等
}
@Override
public void onMessageSent(ZIMMessage zimMessage, ZIMError error) {
// 开发者可以通过该回调监听消息是否发送成功。
}
});
客户端 B 登录 ZIM 后,将会收到在 setEventHandler 回调中设置的 onReceivePeerMessage 监听接口,收到客户端 A 发送过来的消息。
收到消息时,由于类型是基类,首先需要判断消息类型是 Text 还是 Command,开发者需要强转基类为具体的子类,然后从 message 字段获取消息内容。
zim.setEventHandler(new ZIMEventHandler() {
@Override
public void onReceivePeerMessage(ZIM zim, ArrayList<ZIMMessage> messageList, String fromUserID) {
for (ZIMMessage zimMessage : messageList) {
if (zimMessage instanceof ZIMTextMessage)
{
ZIMTextMessage zimTextMessage = (ZIMTextMessage) zimMessage;
Log.e(TAG, "收到的消息:"+ zimTextMessage.message);
}
}
}
});
如果客户端需要退出登录,直接调用 logout 接口即可。
zim.logout();
如果不需要 ZIM 实例,可直接调用 destroy 接口,销毁实例。
zim.destroy();
通过以上的实现流程描述,API 接口调用时序图如下:
联系我们
文档反馈