Vol. 6
从2000年至今,聊天室一直活跃在人们的各种生活场景中,目前广泛运用于超级小班课、互动大班课、连麦开黑、主播 PK 等场景,还具备文本、表情、点赞、撒花等互动方式,架起沟通桥梁的同时,玩法也更加多变。
上一期云信小课堂中,我们和大家分享了《从0搭建聊天室,只需四步( Web 端)》,今天我们将和大家分享如何在安卓端快速集成聊天室,并实现进出聊天室、简单的消息收发、权限管理等功能。同时,我们也提供了一个完善的 UI 组件,会为大家讲解如何利用 UI 组件快速实现应用级别聊天室功能。
视频讲解
9分钟视频,手把手教你接入
集成聊天室-基础篇
一、集成 SDK
Step 1 Gradle 集成
首先,在整个工程的 Build.gradle 文件中,配置 repositories,使用 jcenter 或者 maven ,二选一即可,如下:
allprojects {
repositories {
jcenter() // 或者 mavenCentral()
}
}
然后,在主工程的 Build.gradle 文件中,添加 NDK 支持库:
android {
defaultConfig {
ndk {
//设置支持的SO库架构,根据需要选择对应的架构
abiFilters "armeabi-v7a", "x86","arm64-v8a","x86_64"
}
}
}
再是根据自己项目的需求,添加不同的依赖。
注意:云信的组件版本号必须一致。可在 SDK 下载页面查看当前最新版本。
SDK下载链接:
https://yunxin.163.com/im-sdk-demo
这里以 8.6.0 版本为例:
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
// 添加依赖。注意,版本号必须一致。
// 基础功能 (必需)
implementation 'com.netease.nimlib:basesdk:8.6.0'
// 聊天室需要
implementation 'com.netease.nimlib:chatroom:8.6.0'
}
Step 2 权限与组件
在 AndroidManifest.xml 中加入以下配置(请将 com.netease.nim.demo 替换为自己的包名):
<?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" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 外置存储存取权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 多媒体相关 -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- V4.4.0及之后的版本不需要 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 控制呼吸灯,振动器等,用于新消息提醒 -->
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 8.0+系统需要-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- 下面的 uses-permission 一起加入到你的 AndroidManifest 文件中。-->
<permission
android:name="com.netease.nim.demo.permission.RECEIVE_MSG"
android:protectionLevel="signature"/>
<uses-permission android:name="com.netease.nim.demo.permission.RECEIVE_MSG"/>
<application
...>
<!-- APP key, 可以在这里设置,也可以在 SDKOptions 中提供。
如果 SDKOptions 中提供了,则取 SDKOptions 中的值。-->
<meta-data
android:name="com.netease.nim.appKey"
android:value="key_of_your_app" />
<!-- 云信后台服务,请使用独立进程。-->
<service
android:name="com.netease.nimlib.service.NimService"
android:process=":core"/>
<!-- 云信后台辅助服务 -->
<service
android:name="com.netease.nimlib.service.NimService$Aux"
android:process=":core"/>
<!-- 云信后台辅助服务 -->
<service
android:name="com.netease.nimlib.job.NIMJobService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE"
android:process=":core"/>
<!-- 云信监视系统启动和网络变化的广播接收器,保持和 NimService 同一进程 -->
<receiver android:name="com.netease.nimlib.service.NimReceiver"
android:process=":core"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<!-- 云信进程间通信 Receiver -->
<receiver android:name="com.netease.nimlib.service.ResponseReceiver"/>
<!-- 云信进程间通信service -->
<service android:name="com.netease.nimlib.service.ResponseService"/>
<!-- 云信进程间通信provider -->
<provider
android:name="com.netease.nimlib.ipc.NIMContentProvider"
android:authorities="com.netease.nim.demo.ipc.provider"
android:exported="false"
android:process=":core" />
<!-- 云信内部使用的进程间通信provider -->
<!-- SDK启动时会强制检测该组件的声明是否配置正确,如果检测到该声明不正确,SDK会主动抛出异常引发崩溃 -->
<provider
android:name="com.netease.nimlib.ipc.cp.provider.PreferenceContentProvider"
android:authorities="com.netease.nim.demo.ipc.provider.preference"
android:exported="false" />
</application>
</manifest>
Step 3 混淆配置
如果你的 APK 最终会经过代码混淆,请在 Proguard 配置文件中加入以下代码:
-dontwarn com.netease.**
-keep class com.netease.** {*;}
#如果你使用全文检索插件,需要加入
-dontwarn org.apache.lucene.**
-keep class org.apache.lucene.** {*;}
#如果你开启数据库功能,需要加入
-keep class net.sqlcipher.** {*;}
二、功能使用
Step 1 初始化
需要在 Application 中,初始化云信 SDK:
public class NimApplication extends Application {
public void onCreate() {
SDKOptions sdkOptions = new SDKOptions();
// 初始化云信SDK
NIMClient.init(this, null, sdkOptions );
}
Step 2 进入聊天室
进入聊天室可以有两种方式:以独立模式进入聊天室和非独立模式进入聊天室。
独立模式是指在 IM 处于未登录的情况下,进入聊天室的方式,针对只需要聊天室功能的业务场景。
非独立模式是指先完成 IM 登录,再进入聊天室的方式,针对需要 IM 和聊天室功能的业务场景。
这里只演示独立模式,选择以独立模式进入聊天室时,必须提前设置聊天室独立模式。
独立模式的非匿名登录和非独立模式都需要 accid 和 token,如何获取详见链接:https://doc.yunxin.163.com/docs/TM5MzM5Njk/Dc2NTM1NzI?platformId=60353
// roomId 为聊天室id
EnterChatRoomData data = new EnterChatRoomData(roomId);
//设置appkey
data.setAppKey(appKey);
// 独立模式的非匿名登录,帐号和密码必填,以account和token为例
data.setIndependentMode(new ChatRoomIndependentCallback() {
@Override
public List<String> getChatRoomLinkAddresses(String roomId, String account) {
// 向应用服务器请求聊天室地址
return "服务端返回的聊天室地址列表";
}
}, account, token);
NIMClient.getService(ChatRoomService.class).enterChatRoomEx(data, 1).setCallback(new RequestCallback<EnterChatRoomResultData>() {
@Override
public void onSuccess(EnterChatRoomResultData result) {
Toast.makeText(MainActivity.this,"onSuccess",Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed(int code) {
Toast.makeText(MainActivity.this,"onFailed",Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Toast.makeText(MainActivity.this,"onException",Toast.LENGTH_SHORT).show();
}
});
Step 3 收发消息
先通过 ChatRoomMessageBuilder 提供的接口创建消息对象,然后调用 ChatRoomService 的 sendMessage 接口发送出去即可。下面以文本消息发送为例,其它类型的消息发送方式与 IM 单聊群聊类似:
// 示例用roomId
String roomId = "roomId";// 文本消息内容
String text = "这是聊天室文本消息";// 创建聊天室文本消息
ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomTextMessage(roomId, text);// 将文本消息发送出去
NIMClient.getService(ChatRoomService.class).sendMessage(message, false)
.setCallback(new RequestCallback<Void>() {
@Override
public void onSuccess(Void param) {
// 成功
}
@Override
public void onFailed(int code) {
// 失败
}
@Override
public void onException(Throwable exception) {
// 错误
}
});
通过添加消息接收观察者,在有新消息到达时,就可以接收到通知:
Observer<List<ChatRoomMessage>> incomingChatRoomMsg = new Observer<List<ChatRoomMessage>>() {
@Override
public void onEvent(List<ChatRoomMessage> messages) {
// 处理新收到的消息
}
};
NIMClient.getService(ChatRoomServiceObserver.class)
.observeReceiveMessage(incomingChatRoomMsg, register);
Step 4 离开聊天室
离开聊天室,会断开聊天室对应的链接,并不再收到该聊天室的任何消息。如果用户要离开聊天室,可以手动调用离开聊天室接口,该接口没有回调:
NIMClient.getService(ChatRoomService.class).exitChatRoom(roomId);
集成聊天室- UI 篇
一、集成 UI 组件
Step 1 下载组件
链接:
https://github.com/netease-kit/NIM_Android_Demo/tree/dev_g2
UI 组件的 Demo 已经上传到 Github 仓库中,可以直接下载,下载的 Demo 包含源码形式的 UI 组件库,可以直接导入到一个 Android Studio 项目中。
Step 2 导入到项目中
1、在 Demo 源码中找到 Uikit 文件夹,并复制到自己项目中。
在整个工程的 Build.gradle 文件中,配置 Repositories,如下:
allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}
2、在整个工程的 Build.gradle 文件中,把下面配置添加到末尾;并调整 Uikit 的 Build.gradle 中的配置项和主工程保持一致:
ext {
nimVersion = '8.4.6'
imSdk = "com.netease.nimlib:basesdk:$nimVersion"
avsignallingSdk = "com.netease.nimlib:avsignalling:$nimVersion"
imPushSdk = "com.netease.nimlib:push:$nimVersion"
luceneSdk = "com.netease.nimlib:lucene:$nimVersion"
chatroomSdk = "com.netease.nimlib:chatroom:$nimVersion"
rtsSdk = "com.netease.nimlib:rts:$nimVersion"
superteamSdk = "com.netease.nimlib:superteam:$nimVersion"
ysfSdk = "com.netease.nimlib:ysf:$nimVersion"
ysfkitSdk = "com.netease.nimlib:ysfkit:$nimVersion"
}
3、在项目根目录下,找到 Settings.gradle 文件,并添加以下内容导入Uikit模块:
include ':uikit'
4、在对应 Application/Library 模块的 Build.gradle 文件下添加对 Uikit 模块的依赖:
implementation project(':uikit')
二、功能使用
Step 1 初始化
在 Application 中,在初始化云信 SDK 之后,初始化 Uikit ,请务必放在主进程中初始化,否则可能出现一些异常:
public class NimApplication extends Application {
public void onCreate() {
SDKOptions sdkOptions = new SDKOptions();
// 初始化云信SDK
NIMClient.init(this, null, sdkOptions );
if (NIMUtil.isMainProcess(this)) {
// 初始化 uikit
NimUIKit.init(this);
}
}
Step 2 添加布局
Uikit 中 ChatRoomMessageFragment 以 Fragment 方式实现了聊天室的功能,开发者只需要将该 Fragment 集成到自身的 Fragment 或者 Activity 中即可。
Step 3 进入聊天室
在聊天室 SDK 登录成功的回调中,调用下面代码:
//uikit 进入聊天室
NimUIKit.enterChatRoomSuccess(result, true);
if (messageFragment != null) {
//初始化fragment
messageFragment.init(roomId);
}
Step 4 退出聊天室
退出聊天室的代码比较简单,和 SDK 退出聊天室放在一起即可:
//sdk 退出聊天室
NIMClient.getService(ChatRoomService.class).exitChatRoom(roomId);
//uikit 退出聊天室
NimUIKit.exitedChatRoom(roomId);
总结
以上就是网易云信聊天室解决方案 Demo 安卓端接入流程的详细解说,按照如上步骤就可以轻松完成应用级聊天室的搭建。
任何系统的搭建都不是一蹴而就的,自研搭建聊天室意味着较高的人力成本、时间成本和资金成本。而融合通信云服务专家网易云信所提供的聊天室解决方案,1 天即可完成集成工作,可实现快速上线,轻松应对亿级日活的高并发场景。网易云信也会继续打磨底层技术能力、为开发者提供更多简单集成,快速接入的音视频和即时通讯解决方案。
如果感兴趣或者有需求的开发者可以阅读《技术干货|网易云信大规模聊天室系统架构解析》,或点击阅读原文,免费试用。
云信小课堂推荐阅读
关于网易云信
网易云信是集网易21年IM以及音视频技术打造的融合通信云服务专家,稳定易用的通信与视频 PaaS 平台。
提供融合通信与视频的核心能力与组件,包含 IM 即时通讯、5G 消息平台、一键登录、信令、短信与号码隐私保护等通信服务,音视频通话、直播、点播、互动直播与互动白板等音视频服务,视频会议等组件服务。
网易云信服务于网易云音乐、好未来、新东方、科大讯飞、南京银行等各行各业客户,已有100w+ 企业开发者接入云信服务。