实现单聊/群聊消息收发
更新时间: 2024/03/15 16:12:33
网易云信 IM 即时通讯服务提供一整套即时通讯基础能力,助您快速实现多样化的即时通讯场景。
本文主要介绍通过集成 NetEase IM SDK(NIM SDK)并调用 API,快速实现单聊/群聊消息收发功能。
群聊消息收发需要先进入群组,后续流程与单聊消息收发相同。
使用前准备
-
已在云信控制台创建应用,获取 App Key。
-
已注册云信 IM 账号,获取 IM 账号和 Token。
-
开发环境需满足 Android 4.4 及以上版本。
实现流程
流程概览
实现单聊消息收发的流程,可分为下图所示的 4 大步骤。
步骤 1:集成 SDK
本文主要介绍在 Gradle 中添加远程依赖项的自动集成方式。手动集成方式请参见 Android SDK 集成。
Gradle 集成
-
若您需要创建新项目,在 Android Studio 里,在顶部菜单依次选择 File > New > New Project 新建工程,再依次选择 Phone and Tablet > Empty Activity,单击 Next。
创建 Android 项目成功后,Android Studio 会自动开始同步 gradle, 您需要等同步成功后再进行下一步操作。
-
在项目根目录下的 “build.gradle” 文件中,配置
repositories
(使用 maven)。示例代码如下:groovy
allprojects { repositories { mavenCentral() } }
-
在 “app” 目录下的 “build.gradle” 文件中,配置支持的 SO 库架构。示例代码如下:
groovy
android { defaultConfig { ndk { //设置支持的SO库架构 abiFilters "armeabi-v7a", "x86","arm64-v8a","x86_64" } } }
-
根据开发者项目的需求,添加对应的依赖。
可在 SDK 更新日志中查看最新的版本。
groovy
dependencies { implementation fileTree(dir: 'libs', include: '*.jar') // 添加依赖 // 基础功能 (必需) implementation "com.netease.nimlib:basesdk:${LATEST_VERSION}" }
添加权限
根据实际应用需求,在 AndroidManifest.xml
设置权限(请将 com.netease.nim.demo 替换为自己的包名)。
xml<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.netease.nim.demo">
<!-- 权限声明 -->
<!-- 访问网络状态-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
...>
<!-- APP Key, 可以在这里设置,也可以在 SDKOptions 中提供。
如果 SDKOptions 中提供了,则取 SDKOptions 中的值。 -->
<meta-data
android:name="com.netease.nim.appKey"
android:value="key_of_your_app" />
</application>
</manifest>
更多权限设置,请参见添加权限。
防止代码混淆
代码混淆是指使用简短无意义的名称重命名已存在的类、方法、属性等,增加逆向工程的难度,保障 Android 程序源码的安全性。
为了避免因上述的重命名而导致调用 NIM SDK 异常,请在 proguard-rules.pro 文件中加入以下代码,将 NIM SDK 相关类加入不混淆名单。
groovy-dontwarn com.netease.nim.**
-keep class com.netease.nim.** {*;}
-dontwarn com.netease.nimlib.**
-keep class com.netease.nimlib.** {*;}
-dontwarn com.netease.share.**
-keep class com.netease.share.** {*;}
-dontwarn com.netease.mobsec.**
-keep class com.netease.mobsec.** {*;}
#如果你使用全文检索插件,需要加入
-dontwarn org.apache.lucene.**
-keep class org.apache.lucene.** {*;}
#如果你开启数据库功能,需要加入
-keep class net.sqlcipher.** {*;}
步骤 2:初始化 SDK
将 SDK 集成到客户端后,需要先完成 SDK 的初始化才能使用其他功能。
在 Application
的 onCreate
中,调用 NIMClient#initV2
方法进行初始化。
示例代码如下:
javapublic class NimApplication extends Application {
public void onCreate() {
// 激活V10 API后,可以根据该字段选项选择是否禁用V10 API登录,默认false,即使用V10 API登录
// sdkOptions.disableV2Login = true;
...
// 按需设置其它 SDKOptions 设置项
NIMClient.initV2(context, sdkOptions);
}
}
以上提供了一个简化的初始化示例,更多初始化信息请参见初始化 Android SDK。
步骤 3:登录 IM
客户端用户在使用云信即时通讯功能前需要先登录云信 IM 服务器。
建议参考IM 登录最佳实践实现 IM 登录以及相应的上层应用逻辑。
调用 login
方法进行登录。以静态 Token 登录为例,示例代码如下:
javaNIMClient.getService(V2NIMLoginService.class).login("account", "token", null, new V2NIMSuccessCallback<Void>() {
@Override
public void onSuccess(Void unused) {
// TODO
}
},
new V2NIMFailureCallback() {
@Override
public void onFailure(V2NIMError error) {
int code = error.getCode();
String desc = error.getDesc();
// TODO
}
});
其他登录方式请参见登录登出 IM。
步骤 4:消息收发
本节以用户 A 和用户 B 的消息交互为例,介绍快速实现单聊消息收发的流程。更多消息类型的收发,请参见消息收发。
在创建或加入群组后,用户发送和接收消息的接口与单聊消息收发相同,区别在于会话类型(V2NIMConversationType
)的参数配置,V2NIM_CONVERSATION_TYPE_TEAM(2)
为高级群,V2NIM_CONVERSATION_TYPE_SUPER_TEAM(3)
为超大群。
-
用户 B 调用
addMessageListener
方法注册消息监听器,监听消息接收回调事件onReceiveMessages
。示例代码如下:java
V2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class); V2NIMMessageListener messageListener = new V2NIMMessageListener() { @Override public void onReceiveMessages(List<V2NIMMessage> messages) { // 处理新收到的消息 } }; v2MessageService.addMessageListener(messageListener);
-
用户 A 调用
createTextMessage
方法构建文本消息,然后调用sendMessage
方法向用户 B 发送文本消息。示例代码如下:java
V2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class); // 创建一条文本消息 V2NIMMessage v2Message = V2NIMMessageCreator.createTextMessage("xxx"); // 以单聊类型为例 String conversationId = V2NIMConversationIdUtil.conversationId("xxx", V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P); // 根据实际情况配置 V2NIMMessageAntispamConfig antispamConfig = V2NIMMessageAntispamConfig.V2NIMMessageAntispamConfigBuilder.builder() .withAntispamBusinessId() .withAntispamCheating() .withAntispamCustomMessage() .withAntispamEnabled() .withAntispamExtension() .build(); // 根据实际情况配置 V2NIMMessageConfig messageConfig = V2NIMMessageConfig.V2NIMMessageConfigBuilder.builder() .withConversationUpdateEnabled() .withHistoryEnabled() .withOfflineEnabled() .withOnlineSyncEnabled() .withReadReceiptEnabled() .withRoamingEnabled() .withUnreadEnabled() .build(); // 根据实际情况配置 V2NIMMessagePushConfig pushConfig = V2NIMMessagePushConfig.V2NIMMessagePushConfigBuilder.builder() .withContent() .withForcePush() .withForcePushAccountIds() .withForcePushContent() .withPayload() .withPushEnabled() .withPushNickEnabled() .build(); // 根据实际情况配置 V2NIMMessageRobotConfig robotConfig = V2NIMMessageRobotConfig.V2NIMMessageRobotConfigBuilder.builder() .withAccountId() .withCustomContent() .withFunction() .withTopic() .build(); // 根据实际情况配置 V2NIMMessageRouteConfig routeConfig = V2NIMMessageRouteConfig.V2NIMMessageRouteConfigBuilder.builder() .withRouteEnabled() .withRouteEnvironment() .build(); // 根据实际情况配置 V2NIMSendMessageParams sendMessageParams = V2NIMSendMessageParams.V2NIMSendMessageParamsBuilder.builder() .withAntispamConfig(antispamConfig) .withClientAntispamEnabled() .withClientAntispamReplace() .withMessageConfig(messageConfig) .withPushConfig(pushConfig) .withRobotConfig(robotConfig) .withRouteConfig(routeConfig) .build(); // 发送消息 v2MessageService.sendMessage(v2Message, conversationId, sendMessageParams, new V2NIMSuccessCallback<V2NIMSendMessageResult>() { @Override public void onSuccess(V2NIMSendMessageResult v2NIMSendMessageResult) { // TODO: 发送成功 }, new V2NIMFailureCallback() { @Override public void onFailure(V2NIMError error) { // TODO: 发送失败 } }); }
目前 NIM SDK 支持多种消息类型,包括文本消息、图片消息、语音消息、视频消息、文件消息、地理位置消息、提示消息、通知消息以及自定义消息。具体请参见消息收发。
-
用户 B 通过
onReceiveMessages
回调收到文本消息。
后续步骤
为保障通信安全,如果您在调试环境中的使用的是云信控制台生成的测试用 IM 账号 和 token
,请确保在后续的正式生产环境中,将其替换为通过 IM 新版服务端 API 生成的正式 IM 账号和 token
。