废话不多说,直接开干!
工具要求:
(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。