云信小课堂|搭建应用级别在线聊天室,7步就够了!
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 文件中。--><permissionandroid: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-dataandroid:name="com.netease.nim.appKey"android:value="key_of_your_app" /><!-- 云信后台服务,请使用独立进程。--><serviceandroid:name="com.netease.nimlib.service.NimService"android:process=":core"/><!-- 云信后台辅助服务 --><serviceandroid:name="com.netease.nimlib.service.NimService$Aux"android:process=":core"/><!-- 云信后台辅助服务 --><serviceandroid: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 --><providerandroid:name="com.netease.nimlib.ipc.NIMContentProvider"android:authorities="com.netease.nim.demo.ipc.provider"android:exported="false"android:process=":core" /><!-- 云信内部使用的进程间通信provider --><!-- SDK启动时会强制检测该组件的声明是否配置正确,如果检测到该声明不正确,SDK会主动抛出异常引发崩溃 --><providerandroid: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();// 初始化云信SDKNIMClient.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() {@Overridepublic List<String> getChatRoomLinkAddresses(String roomId, String account) {// 向应用服务器请求聊天室地址return "服务端返回的聊天室地址列表";}
}, account, token);NIMClient.getService(ChatRoomService.class).enterChatRoomEx(data, 1).setCallback(new RequestCallback<EnterChatRoomResultData>() {@Overridepublic void onSuccess(EnterChatRoomResultData result) {Toast.makeText(MainActivity.this,"onSuccess",Toast.LENGTH_SHORT).show();}@Overridepublic void onFailed(int code) {Toast.makeText(MainActivity.this,"onFailed",Toast.LENGTH_SHORT).show();}@Overridepublic 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>() {@Overridepublic void onSuccess(Void param) {// 成功}@Overridepublic void onFailed(int code) {// 失败}@Overridepublic void onException(Throwable exception) {// 错误}});
通过添加消息接收观察者,在有新消息到达时,就可以接收到通知:
Observer<List<ChatRoomMessage>> incomingChatRoomMsg = new Observer<List<ChatRoomMessage>>() {@Overridepublic 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();// 初始化云信SDKNIMClient.init(this, null, sdkOptions );if (NIMUtil.isMainProcess(this)) {// 初始化 uikitNimUIKit.init(this);}
}
Step 2 添加布局
Uikit 中 ChatRoomMessageFragment 以 Fragment 方式实现了聊天室的功能,开发者只需要将该 Fragment 集成到自身的 Fragment 或者 Activity 中即可。
Step 3 进入聊天室
在聊天室 SDK 登录成功的回调中,调用下面代码:
//uikit 进入聊天室
NimUIKit.enterChatRoomSuccess(result, true);
if (messageFragment != null) {//初始化fragmentmessageFragment.init(roomId);
}
Step 4 退出聊天室
退出聊天室的代码比较简单,和 SDK 退出聊天室放在一起即可:
//sdk 退出聊天室
NIMClient.getService(ChatRoomService.class).exitChatRoom(roomId);
//uikit 退出聊天室
NimUIKit.exitedChatRoom(roomId);
总结
以上就是网易云信聊天室解决方案 Demo 安卓端接入流程的详细解说,按照如上步骤就可以轻松完成应用级聊天室的搭建。
任何系统的搭建都不是一蹴而就的,自研搭建聊天室意味着较高的人力成本、时间成本和资金成本。而融合通信云服务专家网易云信所提供的聊天室解决方案,1 天即可完成集成工作,可实现快速上线,轻松应对亿级日活的高并发场景。网易云信也会继续打磨底层技术能力、为开发者提供更多简单集成,快速接入的音视频和即时通讯解决方案。
如果感兴趣或者有需求的开发者可以阅读《技术干货|网易云信大规模聊天室系统架构解析》,或点击阅读原文,免费试用。
云信小课堂推荐阅读
第一期:如何实现音视频通话
第二期:5步构建本土「Clubhouse」
第三期: 5分钟实现安卓端PK连麦场景
第四期:5分钟快速实现iOS端PK连麦场景
第五期:从0搭建在线聊天室,只需4步!
关于网易云信
网易云信是集网易21年IM以及音视频技术打造的融合通信云服务专家,稳定易用的通信与视频 PaaS 平台。
提供融合通信与视频的核心能力与组件,包含 IM 即时通讯、5G 消息平台、一键登录、信令、短信与号码隐私保护等通信服务,音视频通话、直播、点播、互动直播与互动白板等音视频服务,视频会议等组件服务。
网易云信服务于网易云音乐、好未来、新东方、科大讯飞、南京银行等各行各业客户,已有100w+ 企业开发者接入云信服务。
云信小课堂|搭建应用级别在线聊天室,7步就够了!相关推荐
- 云信小课堂丨简单四步,快速搭建协同办公系统!
Vol. 8 企业作为社会分工参与的主体,在自身发展以及内部协作中,势必会涉及到各类自有技术和商业信息的互动与交流,而这类信息由于有着高度的保密性和隐私性,所以如微信.QQ 等通用的即时通讯工具很难满 ...
- 云信小课堂 | 聊天室内容审核很头疼? 3 步解决!
Vol. 7 随着 5G . AI 等颠覆性的技术创新,各类产品的互动性和沉浸感都在快速提升.强互动作为产品快速发展的生命力,也带来了一定程度的安全和监管风险,对通信.安全等技术和服务提出了更高要求. ...
- 云信小课堂|如何实现音视频安全检测?
Vol. 9 泛娱乐类音视频聊天场景中,充斥着各种不可控的风险因素,例如色情.暴恐和涉政信息等.随着国家监管的日趋严格,各平台需要对平台的音视频内容进行管控,自行处理音视频内容审核需要投入大量人力进行 ...
- 云信小课堂|聊天室内容审核很头疼?3步解决!
简介 随着 5G . AI 等颠覆性的技术创新,各类产品的互动性和沉浸感都在快速提升.强互动作为产品快速发展的生命力,也带来了一定程度的安全和监管风险,对通信.安全等技术和服务提出了更高要求. 以娱乐 ...
- 从0搭建在线聊天室,只需4步!
Vol. 5 聊天室不同于单聊和群聊,是一类集成了多种 IM 功能一体的大规模实时消息分发系统.在跨入新世纪的2000年,聊天室作为新型的即时通讯场景迅速在年轻人群体中火热起来,"网易聊天室 ...
- 从头搭建一个基于 Python 的在线聊天室
本场 Chat,是基于 Python + Redis + Flask 来搭建一个简单易用的在线聊天室.完全从零开始,一步一步完成整个项目. 主要分享内容: Flask 项目结构 Python Redi ...
- rudesocket如何使用_[WebSocket入门]手把手搭建WebSocket多人在线聊天室(SpringBoot+WebS...
前言 本文中搭建了一个简易的多人聊天室,使用了WebSocket的基础特性. 源代码来自老外的一篇好文: 本文内容摘要: 初步理解WebSocket的前后端交互逻辑 手把手使用 SpringBoot ...
- 云信小课堂|5分钟快速实现iOS端PK连麦场景
Vol. 4 2021年开年,音频社交风靡互联网,语音社交再成风口,直播连麦开启社交新赛道.在实时通信技术不断革新的现状下,直播平台需要不断探索新的方式以满足用户日益增长的需求,直播连麦就是在此背景下 ...
- 云信小课堂|5分钟快速实现安卓端PK连麦场景
Vol. 3 2021年开年,音频社交风靡互联网,语音社交再成风口,直播连麦开启社交新赛道.在实时通信技术不断革新的现状下,直播平台需要不断探索新的方式以满足用户日益增长的需求,直播连麦就是在此背景下 ...
最新文章
- hudson pending - Waiting for next available executor
- [唐诗]入朝洛堤步月-上官仪
- 非零返回怎么解决_VLOOKUP如何返回多个值?
- 小程序 | 微信小程序二级选择器
- 二叉搜索树的中序遍历为 递增序列_Go 刷 Leetcode 系列:恢复二叉搜索树
- Java性能调优小技巧
- java记秒,Java程序获取自Java时代开始以来的秒数
- Group By和Order By的总结
- EasyRTMP实现对接海康、大华等IPCamera SDK进行RTMP推送直播功能
- 使用网关实现把modbus数据存入sql数据库的方案
- 什么是物联网技术?物联网主要技术有哪些?
- c语言家谱管理系统不是二叉树,二叉树实现的简单家谱管理系统
- 大学计算机excel高级筛选,excel高级筛选的使用方法(入门 进阶 高级)
- WIN10家庭版局域网连接设置(含设置账号密码)
- android 连接web加密的wifi,Android 与WEP加密连接
- CTFHUB POST
- react 实现渐变色背景样式
- 解决乱码的方法(转)
- caffe layer层详解
- 【LAS 】 SRS 开启ATC功能 时间戳测试
热门文章
- (解决)mysql1366中文显示错误的终极解决方案
- windows和Linux内存的对齐方式
- mysql集群不同步_mysql数据库集群出现1236错误导致主库与从库无法同步的
- supervisor python_使用supervisor运行python脚本
- Vscode解决Setting.json报警告:Problems loading reference ... Unable to load schema from ...
- springmvc +bootstrap创建简单web项目
- VS2015配置opencv教程(图文详解)
- 北斗导航 | C语言实现PPP(精密单点定位)
- 光流 | 金字塔迭代(Iterative Pyramidal)LK光流算法(Matlab源代码)
- C语言 | 编程实现2