废话不多说,直接开干!
工具要求:
(1) Android Studio 3.2或更高版本。
(2) SDK targetVersion至少为26。
本文聊天室是集成环信IM SDK实现聊天功能,及实现发送礼物、点赞和弹幕等功能。视频直播采用的是七牛相关的推拉流SDK。app server实现了创建聊天室,记录聊天室信息等功能,采用的是环信配套直播聊天室的开源项目。
因而文章分为三块进行介绍:
1、集成聊天室SDK,实现发送消息功能,实现发送礼物、点赞及弹幕等自定义消息。
2、集成视频直播SDK。
3、与app server的交互。
文末最后附有环信提供的直播聊天室的demo地址,本文章就基于此demo进行集成说明。

集成聊天室SDK,实现消息、发送礼物、点赞及弹幕等功能

1、注册环信账号
如果还没有环信账号的话,就赶紧注册一个吧,注册地址在这里:环信即时通讯云注册。

注册账号后,就可以添加应用了。

在这里需要注意的是注册模式,分为两种:开发注册或授权注册。如果是自己测试用的话,默认开发注册就好,这样在移动端也可以注册环信id。如果是项目中,建议使用授权注册,防止环信id被误注册,有可能会导致将来服务器注册环信id时会失败。
添加完应用后,就可以获得环信的Appkey了。

2、添加build.gradle依赖

implementation 'com.hyphenate:hyphenate-sdk-lite:3.6.7'

最新版本的sdk请从这里查看:环信Android SDK更新日志。
3、SDK初始化
建议在自己的application中进行初始化

EMClient.getInstance().init(context, options);

context就是application,options是对环信提供的对聊天的配置类,举例如下:

 EMOptions options = new EMOptions();//设置rest server地址,如果需要设置的话,一般用环信默认的就好options.setRestServer("xxx.com");//设置im server地址,如果需要设置的话,一般用环信默认的就好options.setIMServer("xxx.xxx.xxx.xxx");//设置im server 端口号options.setImPort(xxx);

当然一般而言是不需要进行配置的,用环信默认的就好,如果需要配置的话,就在EMOptions这个类里进行配置就好。
当然EMOptions还有其他的配置,需要进行配置的话,就看这个类提供的方法吧,说明写的也很详细。
如果需要配置的话,配置好以后,就把设置好的options添加到EMClient.getInstance().init(context, options)中就好。
至此,添加依赖和初始化已经完成了。
同时为了方便大家查看环信SDK的日志,建议大家在调试的时候添加如下设置:

EMClient.getInstance().setDebugMode(BuildConfig.DEBUG);

这段代码就加在SDK初始化后面就好。
4、添加环信Appkey到AndroidManifest.xml中

 <application......><!-- 设置环信应用的AppKey,就在这里填写刚等到的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>

详细的集成配置,参考环信官方文档:Android SDK 导入
5、注册及登录环信id
(1)注册环信id
在实际开发的项目中,一般而言注册环信账号都是app server完成的,如果在第一步注册环信账号的时候,选择的开发注册,就可以在移动端调用如下接口注册环信id了:

EMClient.getInstance().createAccount(username, password);

这里的username就是注册成功后的环信id,username只能是字母和数字。
(2)登录环信id
登录环信id,调用如下接口:

EMClient.getInstance().login(username, password, new EMCallBack() {@Overridepublic void onSuccess() {//注册成功的回调}@Overridepublic void onError(int code, String error) {//注册失败的回调}@Overridepublic void onProgress(int progress, String status) {}});

这里需要注意的是,环信id的字母均是小写的,登录的时候注意一下大小写的转换,否则可能就会造成,注册成功后,怎么老是登录不上去的尴尬事情了。
6、加入聊天室并注册消息监听
项目中创建聊天室是由app server负责完成的,移动端只需根据app server返回的聊天室id加入该聊天室,调用接口如下:

EMClient.getInstance().chatroomManager().joinChatRoom(chatroomId, new EMValueCallBack<EMChatRoom>() {@Override public void onSuccess(EMChatRoom emChatRoom) {//加入聊天室成功,处理其他逻辑}@Override public void onError(int i, String s) {//加入聊天室失败,添加失败的逻辑}});

注册及移除消息监听

    @Overridepublic void onResume() {super.onResume();// register the event listener when enter the foregroundEMClient.getInstance().chatManager().addMessageListener(messageListener);}@Overridepublic void onStop() {super.onStop();// unregister this event listener when this activity enters the// backgroundEMClient.getInstance().chatManager().removeMessageListener(messageListener);}@Overridepublic void onMessageReceived(List<EMMessage> messages) {for (EMMessage message : messages) {String username = null;// 群组消息if (message.getChatType() == EMMessage.ChatType.GroupChat|| message.getChatType() == EMMessage.ChatType.ChatRoom) {username = message.getTo();} else {// 单聊消息username = message.getFrom();}// 如果是当前会话的消息,刷新聊天页面if (username.equals(chatroomId)) {//处理新消息...}}}

根据消息监听,实现消息刷新,礼物,点赞及弹幕等功能。礼物,点赞及弹幕等功能后面再介绍。
注册聊天室监听

//加入聊天室成功后,注册聊天室监听
EMClient.getInstance().chatroomManager().addChatRoomChangeListener(roomChangeListener);

移除聊天室监听

 @Overridepublic void onDestroyView() {super.onDestroyView();EMClient.getInstance().chatroomManager().removeChatRoomListener(roomChangeListener);}

聊天室监听

@Overridepublic void onChatRoomDestroyed(String roomId, String roomName) {if (roomId.equals(chatroomId)) {//聊天室被销毁,则退出页面mContext.finish();}}@Overridepublic void onMemberJoined(String roomId, String participant) {//有成员加入}@Overridepublic void onMemberExited(String roomId, String roomName, String participant) {//有成员退出}@Overridepublic void onRemovedFromChatRoom(int reason, String roomId, String roomName, String participant) {//被移除聊天室}@Overridepublic void onMuteListAdded(String chatRoomId, List<String> mutes, long expireTime) {//被禁言}@Overridepublic void onMuteListRemoved(String chatRoomId, List<String> mutes) {//移出禁言列表}@Overridepublic void onWhiteListAdded(String chatRoomId, List<String> whitelist) {//被加入白名单}@Overridepublic void onWhiteListRemoved(String chatRoomId, List<String> whitelist) {//从白名单中移出}@Overridepublic void onAllMemberMuteStateChanged(String chatRoomId, boolean isMuted) {//一键禁言状态变化}@Overridepublic void onAdminAdded(String chatRoomId, String admin) {//添加管理员}@Overridepublic void onAdminRemoved(String chatRoomId, String admin) {//移出管理员}@Overridepublic void onOwnerChanged(String chatRoomId, String newOwner, String oldOwner) {//主播(房主)发生变化}@Overridepublic void onAnnouncementChanged(String chatRoomId, String announcement) {//公告发生改变}

7、礼物,点赞及弹幕等功能实现
礼物、点赞及弹幕的实现,依靠的是环信提供的自定义消息(CUSTOM)类型实现的。
发送自定义消息如下:

 /*** 发送自定义消息* @param to* @param chatType* @param event 礼物,点赞或者弹幕等定义可由event参数区分* @param params 需要传递的参数,礼物等相关参数就可放于这个参数中* @param callBack*/public void sendCustomMsg(String to, EMMessage.ChatType chatType, String event, Map<String, String> params, final OnMsgCallBack callBack) {final EMMessage sendMessage = EMMessage.createSendMessage(EMMessage.Type.CUSTOM);EMCustomMessageBody body = new EMCustomMessageBody(event);body.setParams(params);sendMessage.addBody(body);sendMessage.setTo(to);sendMessage.setChatType(chatType);EMClient.getInstance().chatManager().sendMessage(sendMessage);}

具体用法可参考环信自定义消息类型用法:发送自定义类型消息。
实际开发中,可以对自定义消息进行进一步的封装,比如最终封装为发送礼物,发送点赞和发送弹幕的方法,可参考如下:

 /*** 发送礼物消息* @param giftId 礼物id* @param num  礼物数量* @param callBack*/public void sendGiftMsg(String giftId, int num, OnMsgCallBack callBack) {Map<String, String> params = new HashMap<>();params.put(MsgConstant.CUSTOM_GIFT_KEY_ID, giftId);params.put(MsgConstant.CUSTOM_GIFT_KEY_NUM, String.valueOf(num));sendGiftMsg(params, callBack);}

8、聊天室页面的搭建及礼物等动画的实现
具体的根据项目产品经理的要求进行开发,最后附的环信直播聊天室中有搭建的页面以及一些基本动画的实现,可以借鉴一下。
至此,环信IM SDK集成及实现就完成了。下面看看如何集成七牛的SDK。

集成视频直播SDK,实现视频直播及播放

demo中是将视频直播的相关逻辑,抽取到library中,为了方便进行视频SDK的更换。
基于环信demo中提供的视频直播方案,就以集成七牛SDK进行说明。
1、注册七牛账号。
注册地址:七牛
注册完七牛账号以后,需要配置自己的域名,如果还没有域名的话,需要到有关部门去备案才可以。

2、添加推拉流依赖
因为七牛没有提供远程依赖,直接去下载jar包置于libs文件夹下,so文件置于jniLibs文件夹下即可。
推流jar包及so文件下载地址:推流端。
播放端jar包及so文件下载地址:播放端。
3、添加相关权限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_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.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

以上权限包含推拉流两端。
4、推流端初始化

StreamingEnv.init(getApplicationContext());

建议在application中进行初始化。
5、搭建推拉流页面
具体页面搭建,参考环信demo。
6、设置推拉流地址
(1)设置推流地址
推流地址从app server请求得到,因为app server需要进行鉴权等操作,得到推流地址后设置如下:

StreamingProfile mProfile = new StreamingProfile();
mProfile..setPublishUrl(publishUrl);

具体设置可以参考环信直播聊天室中PushStreamHelper中的设置,或者参考七牛官网给的参数设置。
(2)播放地址设置
推流地址也是从app server请求得到的,设置如下:

//在调用播放器的控制接口之前,必须先设置好播放地址.传入播放地址,可以是 /path/to/local.mp4 本地文件绝对路径,或 HLS URL,或 RTMP URL
videoview.setVideoPath(url);
......
videoview.start();

videoview为七牛SDK提供的PLVideoTextureView类。
具体设置可以参考环信直播聊天室,或者参考七牛播放端SDK功能使用。
7、注意事项
(1)需注册七牛账号,并通过七牛官网申请并开通直播权限。
(2)推流SDK v3.0.0 及以后版本需要获取授权才可使用,即SDK会校验包名,需联系七牛客服获取授权。
(3)demo中推拉流地址需替换为自己的域名。

至此视频直播的推拉流SDK都集成完了,就可以进行简单的推拉流了,如果要设置美颜或者添加更加详细的设置,请查看七牛推流端设置和七牛播放端设置。
下面介绍移动端与app server间的交互。

与app server的交互

环信提供配套的app server demo在这里:AppServer.。
具体app server api介绍看这里:直播间API文档。
目前app server提供了如下接口:
1、创建直播间

    /*** 创建直播室* @param module 包括直播室名称,直播室描述,直播室房主,直播室封面,直播室最大人数* @return*/@POST("liverooms")LiveData<LiveRoom> createLiveRoom(@Body LiveRoom module);

2、获取直播间详情

 /*** 直播室详情* @param roomId 直播室id* @return*/@GET("liverooms/{id}")LiveData<LiveRoom> getLiveRoomDetail(@Path("id") String roomId);

该接口会返回直播间id,owner,mute,maxusers等信息。
3、分页获取直播间列表

 /*** 获取直播室列表* @param limit 一次取的条数* @param cursor 在这个游标基础上取数据,首次获取传null* @return*/@GET("liverooms")LiveData<ResponseModule<List<LiveRoom>>> getLiveRoomList(@Query("limit") int limit, @Query("cursor") String cursor);

4、分页获取正在直播的直播间列表

 /*** 获取正在直播的直播室列表* @param limit 一次取的条数* @param cursor 在这个游标基础上取数据,首次获取传null* @return*/@GET("liverooms/ongoing")LiveData<ResponseModule<List<LiveRoom>>> getLivingRoomList(@Query("limit") int limit, @Query("cursor") String cursor);

5、修改直播状态

 /*** 改变直播状态* @param roomId* @param username* @param status 可以为ongoing或offline两种状体* @return*/@POST("liverooms/{liveroomid}/users/{username}/{status}")LiveData<LiveRoom> changeLiveStatus(@Path("liveroomid") String roomId,@Path("username") String username,@Path("status") String status);

status可以为ongoing或offline两种状体,分别代表开始直播和结束直播。
6、获取推流地址

 /*** 获取推流地址* @param streamKey* @return*/@GET("streams/url/publish/")LiveData<LiveRoomUrlBean> getLiveRoomPublishUrl(@Query("streamKey")String streamKey);

参数domain(推流域名),hub(直播空间名)和expire(获取推流url过期时间)是可选参数。
7、获取播放地址

    /*** 获取播放地址* @param streamKey* @return*/@GET("streams/url/play/")LiveData<LiveRoomUrlBean> getLiveRoomPlayUrl(@Query("streamKey")String streamKey);

注意:
(1)需要注意的是文档中路径格式如下:Path: http://localhost:8080/appserver/liverooms,如果在本地调试时使用localhost有问题,请更换为本地的ip地址即可。

喜大乐奔,至此,可以实现基本的直播聊天室了。
最关键的来了,这是有源码的!!
赶紧拿走吧,下面就是源码地址:
环信直播聊天室
环信App Server。

手把手带你快速实现直播聊天室相关推荐

  1. 手把手带你快速实现直播平台源码聊天室

    工具要求: (1) Android Studio 3.2或更高版本. (2) SDK targetVersion至少为26. 本文直播平台源码聊天室是集成环信IM SDK实现聊天功能,及实现发送礼物. ...

  2. 【干货】直播聊天室详细分解,让你一眼学会快速搭建!

    直播聊天室 为方便开发者了解和接入融云直播聊天室,本文将介绍融云直播聊天室功能特点.主要构成及常见功能的解决方案. 产品介绍 融云直播聊天室,是专门为视频直播业务提供的一个产品.主要特点是: 丰富的聊 ...

  3. 【直播聊天室】Android开发源码

    基本概念 一.融云直播聊天室介绍 融云直播聊天室,是专门为视频直播业务提供的一个产品.主要特点是: 1.可以支持无人数上限的直播聊天室: 2.支持海量消息的并发,消息速度极快: 3.并可以方便的为直播 ...

  4. 微信团队分享:微信直播聊天室单房间1500万在线的消息架构演进之路

    本文由微信开发团队工程师" kellyliang"原创发表于"微信后台团队"公众号,收录时有修订和改动. 1.引言 随着直播和类直播场景在微信内的增长,这些业务 ...

  5. 网易云信直播聊天室:无上限人数系统不卡顿,是不是鱼与熊掌不能兼得?

    1.直播聊天室的形式和应用场景 在一般人的理解中,直播聊天室应该就是直播画面旁边配一个聊天窗口,众多观看者在 里面发表自己的评论(如图1).Oh, NO!这样的场景是不是太Low啦!随着互联网技术和消 ...

  6. 【直播聊天室】特点、构成及解决方案简介

    为方便开发者了解和接入融云直播聊天室,本文将介绍融云直播聊天室功能特点.主要构成及常见功能的解决方案. 一.产品介绍 融云直播聊天室,是专门为视频直播业务提供的一个产品.主要特点是: 丰富的聊天室消息 ...

  7. 直播聊天室的无限用户优化实践(六千字技术文)

    融云近期推出直播 SDK,两步即可实现视频直播能力.在第二步"开始直播"阶段,调用一个接口就能发布视频流,其他用户便可加入房间观看直播并在公屏发送弹幕与主播互动.移步[融云全球互联 ...

  8. 融云即时通讯之直播聊天室

    前言 做直播当然少不了聊天功能,融云直播聊天室支持消息类型包括文字.语音.图片.点赞.礼物.弹幕等,也支持通过自定义消息实现自已的业务逻辑:支持聊天室用户管理功能,包括创建.加入.销毁.禁言.查询.封 ...

  9. 微信直播聊天室单房间1500万在线的消息架构演进之路

    1.引言 随着直播和类直播场景在微信内的增长,这些业务对临时消息(在线状态时的实时消息)通道的需求日益增长,直播聊天室组件应运而生.直播聊天室组件是一个基于房间的临时消息信道,主要提供消息收发.在线状 ...

  10. 手把手带你快速入门超越GAN的Normalizing Flow

    手把手带你快速入门超越GAN的Normalizing Flow 作者:Aryansh Omray,微软数据科学工程师,Medium技术博主 机器学习领域的一个基本问题就是如何学习复杂数据的表征是机器学 ...

最新文章

  1. android自定义离线地图,MapBox GL Android:已下载但未使用的自定义磁贴源的离线地图...
  2. Eclipse + CDT引入OpenCV失败的解决的方法
  3. 克服协作的五种障碍_如何克服社区管理的障碍
  4. mega2560电脑识别不到端口后_Qt音视频开发41-人脸识别嵌入式
  5. 360解压电脑版安装包_鲁大师电脑版2020下载-鲁大师pc版安装包exe下载v6.1020.3005.1020 官方最新版...
  6. 1e-5 java_内功心法 -- java.util.LinkedListE (5)
  7. 系统学习深度学习(十三)--Batch Normalization
  8. java电器类代码_阅读下列说明和Java代码,将应填入(n)处的字句写在对应栏内。...
  9. hdu 6096 String(AC自动机巧妙建图)
  10. C语言函数大全 chm含示例
  11. 群晖 VMM虚拟机安装windows XP
  12. 常见的系统间接口方式(02)-中间件的数据接口模式
  13. entrez检索系统要服务器吗,Entrez检索系统的简介.doc
  14. 【异常处理】devcpp编译时 “源文件未编译”
  15. 【ThreeJS基础教程-高级几何体篇】2.5 加载GLTF/GLB格式文件,Draco压缩文件的获取与加载
  16. QML快捷键(Shortcut、Keys)
  17. 量子计算机用什么传导信息,量子是如何传递信息的?
  18. python3使用代理 报错MaxRetryError
  19. Tuscany SCA软件架构设计理念分析(二)
  20. 【计算机视觉实验二】特征提取与匹配

热门文章

  1. java对接PayPal支付 (添加物流跟踪信息)
  2. PayPal第一次提现失败手续费返还教程
  3. 关于python中的复数的虚部可以j或i_Python 中的复数问题
  4. kindle 耗电飞速,电池坏了?你可能给kindle“吃了有毒的食物”
  5. css实现剪切蒙版,魔法般的网页图片修剪!使用Houdini建立CSS剪切蒙版
  6. win7(32位)旗舰版共享HP1010打印机给WINXP专业版
  7. 因果推断理论框架 Potenial Outcomes Framework
  8. 最简单易懂的SpringCloudSleuth教程(spring cloud体系的链路追踪系统)
  9. 鸿蒙开发板hi3861硬件SPI通信arduinoUNO
  10. c#求长方形的面积周长公式_长方形的面积和周长公式是什么?