Android端集成

本文介绍了使用低代码集成(含UI)方式快速接入互动直播Android端的方法。

前提条件

环境要求

  • 系统版本:支持Android 5.0及以上版本。

  • API版本:支持21及以上版本。

  • CPU架构:支持实体设备架构armeabi-v7a、arm64-v8a。

  • 其他:不支持视频采集旋转,不支持USB外接摄像头。

集成步骤

注意

强烈推荐直接克隆Demo源码,更改配置参数即可运行。

流程概览

添加SDK依赖 > 添加配置权限 > 添加proguard配置(可选) > 完成工程编码。

第一步:添加SDK依赖

SDK依赖可通过远程依赖或文件依赖方式添加。推荐使用远程依赖方式。

  • 方式1:远程添加依赖(推荐

    1.配置依赖仓库。

    // 仓库地址
    allprojects {
        repositories {
            maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases' }
        }
    }

    2.添加SDK依赖。

    def LATEST_VERSION = '' // Android_SDK_LATEST_VERSION
    dependencies {
        api "com.aliyun.roompaas.biz:liveroom:${LATEST_VERSION}"
    }
  • 方式2:添加文件依赖

    1.下载并解压SDK。登录低代码音视频工厂控制台>应用管理>低代码集成,下载最新Android端SDK。

    2.复制aar文件到主工程下的libs文件夹中。

    3.配置aar依赖。在build.gradle文件下的dependencies字段下添加代码:

    implementation fileTree(dir: "libs", include: ["*.jar", ""*.aar""])

第二步:添加权限配置

添加完SDK依赖后,打开 AndroidManifest.xml 文件,添加如下权限配置。

<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" />

第三步:添加proguard配置(可选)

SDK中使用了反射,如果您的应用中打开了混淆开关,则需要添加proguard配置。请打开 proguard-rules.pro 文件,添加如下-keep类的配置。

-dontnote *.**
-dontwarn *.**

# live sdk
-keep class com.aliyun.** { *; }
-keep class com.alivc.** { *;}
-keep class com.cicada.** { *; }

# lwp
-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.** { *; }

# fastjson
-dontwarn com.alibaba.fastjson.**
-keepattributes Signature
-keepattributes *Annotation*

第四步:工程编码

1. 完成SDK初始化及认证。代码示例如下:

// SDK初始化&认证
LivePrototype.InitParam param = new LivePrototype.InitParam();
param.appId = "<应用Id>";  //在阿里云本产品控制台应用管理中获取
param.appKey = "<应用Key>";  //在阿里云本产品控制台应用管理中获取
param.serverHost = "<服务端地址>"; //请参见服务调用地址使用说明文档,在服务部署完成之后获取“服务调用地址”
param.serverSecret = "<服务端接口密钥>"; //请参见服务调用地址使用说明文档,在服务部署完成之后获取“密钥”
param.userId = "<用户身份标识>";//自定义用户id,仅支持英文和数字,最大长度36位
LivePrototype.getInstance().init(this, param);

2. 主播端开启直播。代码示例如下:

// 主播端: 开启直播
String currentUserId = Const.getCurrentUserId();
LivePrototype.OpenLiveParam param = new LivePrototype.OpenLiveParam();
param.role = LivePrototype.Role.ANCHOR;
param.nick = "用户" + currentUserId;
LivePrototype.getInstance().setup(this, param, new Callback<String>() {
    @Override
    public void onSuccess(String liveId) {
        // 此处获取到liveId
    }
    @Override
    public void onError(String errorMsg) {
        
    }
});

3. 观众端观看直播。代码示例如下:

// 观众端: 观看直播
String liveId = "71973fb0-****-****-****-ebb20bd9d650";//此处替换为主播开播后的获取到的liveId
String currentUserId = Const.getCurrentUserId();
LivePrototype.OpenLiveParam param = new LivePrototype.OpenLiveParam();
param.role = LivePrototype.Role.AUDIENCE;
param.nick = "用户" + currentUserId;
param.liveId = liveId;
LivePrototype.getInstance().setup(this, param, new Callback<String>() {
    @Override
    public void onSuccess(String liveId) {
        
    }
    @Override
    public void onError(String errorMsg) {
    }
});

4. 完成接入。

  • 如您对直播间没有额外的定制需求,到此您已经完成互动直播Android端的接入,可以直接运行体验。效果如下图。

  • 如您需要对直播间进行扩展开发,请参见Android端扩展开发

样板间接入流程

常见问题

如何调用SDK中的插件服务?

继承 BaseComponent 之后,可以拿到直播服务 LiveService、互动服务 ChatService,然后对其做相关操作,以下罗列了常用的方法调用。

// -------------------- 直播间相关操作 ------------------------
// 判断当前是否是主播身份
boolean owner = roomChannel.isOwner();
// 更新直播公告
roomChannel.updateNotice("新公告", null);
// 直播间踢人
roomChannel.kickUser("<被踢人用户Id>", null);

// -------------------- 直播插件相关操作 ------------------------
// 切换前后摄像头
liveService.getPusherService().switchCamera();
// 开启/关闭美颜
liveService.getPusherService().setBeautyOn(true);

// -------------------- 互动插件相关操作 ------------------------
// 用户禁言 (60为禁言时长, 单位:秒)
chatService.banComment("<被禁言用户Id>", 60, null);
// 发送弹幕
chatService.sendComment("<弹幕信息>", null);
// 发送自定义消息
chatService.sendCustomMessageToAll("<自定义消息>", null);

如何监听SDK中的事件?

在 onInit 中设置事件监听,参考如下代码说明。

@Override
public void onInit(LiveContext liveContext) {
    super.onInit(liveContext);
    
    // 直播间事件监听
    roomChannel.addEventHandler(new SampleRoomEventHandler() {
        @Override
        public void onEnterOrLeaveRoom(RoomInOutEvent event) {
            // 用户进出直播间监听
        }
        @Override
        public void onRoomNoticeChanged(String notice) {
            // 群公告发生改变
        }
    });
    
    // 直播插件事件监听
    liveService.addEventHandler(new SampleLiveEventHandler() {
        @Override
        public void onLiveStarted(LiveCommonEvent event) {
            // 直播开始
        }
        @Override
        public void onLiveStopped(LiveCommonEvent event) {
            // 直播结束
        }
        @Override
        public void onPusherEvent(LiveEvent event) {
            // 主播端才能收到的事件
            switch (event) {
                case PUSH_STARTED:
                    // 推流开始
                    break;
                case PUSH_STOPPED:
                    // 推流结束
                    break;
            }
        }
    });

    // 互动插件事件监听
    chatService.addEventHandler(new SampleChatEventHandler() {
        @Override
        public void onCommentReceived(CommentEvent event) {
            // 收到弹幕消息
        }
        @Override
        public void onCustomMessageReceived(CustomMessageEvent event) {
            // 收到自定义消息
        }
        @Override
        public void onLikeReceived(LikeEvent event) {
            // 收到点赞信息变化
        }
        @Override
        public void onCommentMutedOrCancel(MuteCommentEvent event) {
            // 收到禁言事件
        }
        @Override
        public void onCommentAllMutedOrCancel(MuteAllCommentEvent event) {
            // 收到全员禁言事件
        }
    });
}

为什么直播的渲染区域有黑边?如何去除?

渲染区域黑边是为了保证渲染的View区域和实际渲染内容区域不一致时,内容能够完全在屏幕上展示出来,类似于 ImageView 中 ScaleType 的 fitCenter 和 centerCrop 的区别。

如果需要去除该黑边,请在 setup 方法中设置 LivePrototype.OpenLiveParam#liveShowMode 为 CanvasScale.Mode.ASPECT_FILL 即可。

扩展阅读