本文介绍Android端集成AUI Kits低代码集成工具互动直播场景SDK的操作方式、注意事项及相关代码示例等内容。
源码说明
源码下载
下载地址请参见源码下载。
源码结构
|-- AliInteractionLiveDemo-Android //Demo根目录
| |--app //Demo代码
| |--AUIInteractionBusiness //AUI 业务逻辑封装
- AUIMessage //AUI 直播互动业务组件
- AUIPlayer //AUI 播放业务组件
- AUICommon //AUI 业务逻辑common组件
| |--AUIInteractionCore //AUI 核心依赖库
| |--AUIInteractionUikit //AUI base组件
| |--AUIInteractionLiveRoom //AUI InteractionLive组件
| |--AUIInteractionBeauty //AUI 美颜业务组件
环境要求
- Android 5.0(SDK API Level 21)及以上版本。
- 建议使用Android Studio 4.0以及以上版本。
- Android 5.0或以上版本的真机,暂不支持模拟器调试。
前提条件
(可选)跑通Demo
- 下载并解压Demo文件。下载地址请参见源码下载。
- 配置工程文件。使用Android Studio,选择,选择上一步下载的Demo工程文件。
- 链接Android真机,连接成功后显示如下图。
- 单击下图绿色运行按钮,构建工程文件。
- 安装到Android真机上,运行互动直播应用。
快速集成
本节介绍如何在您的App工程中集成AUIInteractionLive,快速实现互动直播功能。
导入源码
下载并导入AUI Lits相关组件。
- 克隆AUI互动直播工程代码AliInteractionLiveDemo-Android。
- 拷贝工程下的AUIInteractionCore、AUIInteractionBusiness/AUIMessage、AUIInteractionBusiness/AUIPlayer、AUIInteractionBusiness/AUICommon、AUIInteractionLiveRoom、AUIInteractionUikit、AUIInteractionBeauty文件夹到您的工程中。
- 在setting.gradle中完成导入。
include ':AUIInteractionLiveRoom' include ':AUIInteractionUikit' include ':AUIInteractionCore' include ':AUIInteractionBeauty' include ':AUIInteractionBusiness:AUICommon' include ':AUIInteractionBusiness:AUIPlayer' include ':AUIInteractionBusiness:AUIMessage'
- 在App的build.gradle文件中添加对应的
moudle
依赖。api project(':AUIInteractionLiveRoom') api project(':AUIInteractionUikit') api project(':AUIInteractionCore') api project(':AUIInteractionBeauty') api project(':AUIInteractionBusiness:AUICommon') api project(':AUIInteractionBusiness:AUIPlayer') api project(':AUIInteractionBusiness:AUIMessage')
工程配置
配置权限、混淆及License文件。
- 在AndroidManifest.xml中配置App的权限,SDK需要以下权限(6.0以上的Android系统需要动态申请相机、麦克风权限等)。
<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.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.WAKE_LOCK" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <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.FOREGROUND_SERVICE" />
- 在proguard-rules.pro文件中,将SDK相关类加入不混淆名单。
-keep class com.alivc.** { *; } -keep class com.aliyun.** { *; } -keep class com.aliyun.rts.network.* { *; } -keep class org.webrtc.** { *; } -keep class com.alibaba.dingpaas.** { *; } -keep class com.dingtalk.mars.** { *; } -keep class com.dingtalk.bifrost.** { *; } -keep class com.dingtalk.mobile.** { *; } -keep class org.android.spdy.** { *; } -keep class com.alibaba.dingpaas.interaction.** { *; } -keep class com.cicada.**{*;}
- 配置License文件。
- 在build.gradle文件中增加Maven配置。
allprojects { repositories { mavenCentral() jcenter() google() maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases' } } }
- 配置直播互动依赖。
api 'com.aliyun.sdk.android:aliinteraction-cxx:1.0.0' api 'com.aliyun.sdk.android:aliinteraction-android:1.0.0'
- 在AUIInteractionLiveRoom工程下找到RetrofitManager文件,修改您的server访问地址。
com.aliyun.aliinteraction.liveroom.network.RetrofitManager#SERVER_URL
- 配置local.properties文件,设置自己的SDK访问路径。
sdk.dir=/Users/xx/Library/Android/sdk ndk.dir=/Users/xx/Library/Android/ndk
- 参照Demo中的CreateRoomActivity(创建房间)、RoomListActivity(房间列表)进行调用。
直播调用流程图
普通直播

连麦直播
- 无人连麦
- 有人连麦
API参考
与互动消息SDK封装的消息服务API
public interface AUIMessageService {
/**
* 发送弹幕
*
* @param content 消息体内容
* @param callback 回调函数
*/
void sendComment(String content, Callback<String> callback);
/**
* 开始直播
*
* @param callback 回调函数
*/
void startLive(Callback<String> callback);
/**
* 结束直播
*
* @param callback 回调函数
*/
void stopLive(Callback<String> callback);
/**
* 更新公告
*
* @param notice 公告内容
* @param callback 回调函数
*/
void updateNotice(String notice, Callback<String> callback);
/**
* 申请连麦 (观众端调用)
*
* @param receiveId 指定接收消息的人 (该场景为主播id)
* @param callback 回调函数
*/
void applyJoinLinkMic(String receiveId, Callback<String> callback);
/**
* 处理连麦申请 (主播端调用)
*
* @param agree true: 同意, false: 拒绝
* @param applyUserId 申请人的ID
* @param rtcPullUrl 主播端的rtc拉流地址
* @param callback 回调函数
*/
void handleApplyJoinLinkMic(boolean agree, String applyUserId, String rtcPullUrl, Callback<String> callback);
/**
* 上麦通知
*
* @param rtcPullUrl 上麦观众的rtc拉流地址
*/
void joinLinkMic(String rtcPullUrl, Callback<String> callback);
/**
* 下麦通知
*
* @param reason 下麦原因
*/
void leaveLinkMic(String reason, Callback<String> callback);
/**
* 踢下麦 (主播端调用)
*
* @param userId 踢下麦的用户ID
* @param callback 回调函数
*/
void kickUserFromLinkMic(String userId, Callback<String> callback);
/**
* 更新麦克风状态
*
* @param opened true:打开; false:关闭;
*/
void updateMicStatus(boolean opened, Callback<String> callback);
/**
* 更新摄像头状态
*
* @param opened true:打开; false:关闭;
*/
void updateCameraStatus(boolean opened, Callback<String> callback);
/**
* 取消申请连麦 (观众端调用)
*
* @param receiveId 指定接收消息的人 (该场景为主播ID)
*/
void cancelApplyJoinLinkMic(String receiveId, Callback<String> callback);
/**
* 命令某人更改麦克风状态
*
* @param receiveId 被命令人的ID
* @param open true:打开; false:关闭;
* @param callback 回调函数
*/
void commandUpdateMic(String receiveId, boolean open, Callback<String> callback);
/**
* 命令某人更改摄像头状态
*
* @param receiveId 被命令人的ID
* @param open true:打开; false:关闭;
* @param callback 回调函数
*/
void commandUpdateCamera(String receiveId, boolean open, Callback<String> callback);
/**
* 添加消息监听器
*
* @param messageListener 消息监听器
*/
void addMessageListener(AUIMessageListener messageListener);
/**
* 移除消息监听器
*
* @param messageListener 消息监听器
*/
void removeMessageListener(AUIMessageListener messageListener);
/**
* 移除所有消息监听器
*/
void removeAllMessageListeners();
}
与AppServer相关的API
public interface ApiService {
@POST("live/login")
//登录
ApiInvoker<AppServerToken> login(@Body LoginRequest request);
//获取token校验合法性
@POST("live/token")
ApiInvoker<Token> getToken(@Body TokenRequest request);
//创建直播间
@POST("live/create")
ApiInvoker<LiveModel> createLive(@Body CreateLiveRequest request);
//更新直播间信息,比如更新公告等
@POST("live/update")
ApiInvoker<LiveModel> updateLive(@Body UpdateLiveRequest request);
//获取直播间信息,方便进入直播间信息展示
@POST("live/get")
ApiInvoker<LiveModel> getLive(@Body GetLiveRequest request);
//推流成功后, 调用此服务通知服务端更新状态(开播状态)
@POST("live/start")
ApiInvoker<Void> startLive(@Body StartLiveRequest request);
//停止推流后, 调用此服务通知服务端更新状态(停播状态)
@POST("live/stop")
ApiInvoker<Void> stopLive(@Body StopLiveRequest request);
//获取直播间列表
@POST("live/list")
ApiInvoker<List<LiveModel>> getLiveList(@Body ListLiveRequest request);
//主播将最新的麦上成员列表更新到AppServer端,直播间连麦管理模块用
@POST("live/updateMeetingInfo")
ApiInvoker<MeetingInfo> updateMeetingInfo(@Body UpdateMeetingInfoRequest request);
//获取连麦观众信息,直播间连麦管理模块用
@POST("live/getMeetingInfo")
ApiInvoker<MeetingInfo> getMeetingInfo(@Body GetMeetingInfoRequest request);
}
组件定制
直播间中涉及到的视图逻辑非常复杂,视图与视图之间还会存在一定的联动逻辑。例如:底部的点赞和顶部的点赞分别对应点赞逻辑的写和读,底部的输入框和弹幕面板分别对应弹幕逻辑的写和读。
代码设计秉承高内聚低耦合原则,抽象出组件的概念,旨在将视图逻辑在一个独立的范围内自闭环。在房间页面,能看到的每个视图,大到整个信息面板,小到分享、点赞、美颜等图标,都属于组件。
考虑到组件和组件之间有着极为复杂的相对位置关系,SDK内部设计通过setContentView传递的XML资源文件来进行组件的灵活配置。
以下内容以自定义一个能够监听弹幕信息的组件为例说明如何自定义组件。
- 新建自定义组件CustomMessageView。
public class CustomMessageView extends AppCompatTextView implements ComponentHolder { private final Component component = new Component(); public CustomMessageView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); setTextColor(Color.RED); setTextSize(TypedValue.COMPLEX_UNIT_SP, 24); } @Override public IComponent getComponent() { return component; } private class Component extends BaseComponent { @Override public void onInit(LiveContext liveContext) { super.onInit(liveContext); // 设置弹幕内容的回调监听事件 getMessageService().addMessageListener(new SimpleOnMessageListener() { @Override public void onCommentReceived(Message<CommentModel> message) { setText(String.format("%s: %s", message.senderInfo.userNick, message.data.content)); } }); } } }
- 在ilr_activity_live.xml文件中的LiveContentLayer节点末尾添加自定义信息组件。添加后如下图所示。
- 安装并运行应用,即可实现再次收到弹幕信息时,屏幕中间也能显示。