数字人流媒体服务AndroidSDK

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

数字人开放平台推出的适用于Android数字人流媒体服务SDK。当您调用服务端OpenAPI StartInstance接口获取RTCIM参数信息后,可以在Android搭建App,实现数字人拉流和双工对话。AliyunAvatarSDK通过Android RTC音视频通信(DingRTC)提供视频流的订阅,并通过标准WebSocket与服务端建立IM连接。

SDK 1.2.2升级说明

本次版本升级将AliRTC升级到DingRTC,主要变更点如下

重要
  • 1.2.2版本升级后,视频解码由SDK根据设备型号自适应选择硬件解码/软件解码,外部传入的解码参数不再生效

  • 1.2.2版本升级后,不再提供透明背景(绿幕抠图)功能,用户可以通过获取视频帧后,通过自定义渲染器的方式完成抠图

  • 1.2.2版本升级前,需要在控制台手动重启3D数字人流媒体实例,避免获取鉴权信息失败

接入前须知

  1. SDK不包含操作服务端实例的接口(如启动数字人、结束数字人、播报文本等功能),如有需要请参考OpenAPI文档;

  2. Demo 需要依赖配合后端应用才能体验,请先确认建立好可以调用OpenAPI的后端应用。

  3. 使用限制:

    1. 系统版本:支持Android 6.0,API 23及以上版本。

    2. CPU架构:支持armeabi-v7a、arm64-v8a。

接入方法

  1. 下载数字人示例工程,SDK AAR包为示例工程的libs/AliyunAvatarSDK_1.2.2.aar。

  2. SDK 集成依赖导入。

  3. 获取设备相关权限。

集成SDK

  1. 在项目中使用时,您需要把下载得到的AliyunAvatarSDK.aar放入app模块下的libs文件夹中,并在app/build.gradle文件中添加导入。

implementation fileTree(include: ['*.aar'], dir: 'libs')
  1. 在根目录的build.gradle中添加Maven仓库地址:

allprojects {
  repositories {
    google()
    jcenter()
    //添加如下的Maven地址
    maven {
      url "http://maven.aliyun.com/nexus/content/groups/public/"
    }
  }
}
  1. AliyunAvatarSDK依赖于OkHttp、DingRTCfastjson三个库,您需要手动将相关依赖导入

implementation 'com.squareup.okhttp3:okhttp:4.4.1'
implementation 'com.alibaba:fastjson:1.2.83'
implementation 'com.ding.rtc:dingrtc-full:3.7.5'
  1. app/src/main/AndroidManifest.xml文件中添加如下代码,获取相应的设备权限。

<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.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> 
重要
  1. 对于敏感权限,如 Manifest.permission.WRITE_EXTERNAL_STORAGE 和 Manifest.permission.RECORD_AUDIO 等,需要在代码中调用ActivityrequestPermissions方法获取运行时权限。

  2. 对于使用Android S 及以上系统的设备,还需要再动态申请 Manifest.permission.BLUETOOTH_CONNECT 权限,以保证RTC可以正确的初始化。

  3. 您需要在App《隐私权政策》中告知用户使用了DingRTC服务,具体告知方式详见:https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202112151438_20307.html?spm=a2c4g.11186623.0.0.49fd18678NSHPJ

  1. 可选:配置防止代码混淆。

proguard-rules.pro文件中,添加-keep类的配置,可以防止混淆RTC SDK公共类名称。

-keep class com.serenegiant.**{*;}
-keep class org.webrtc.**{*;}
-keep class com.ding.rtc.**{*;}
-keep class com.alivc.**{*;}
-keep class com.aliyun.avatarsdk.**{*;}

互动数字人

新建一个实例

AvatarSDK avatarSDK = AvatarSDK.createDialogAvatarInstance(context,
                                            avatarSDKListener, 
                                            avatarInstanceInfo, 
                                            options);

参数说明

参数

类型

必填

描述

context

Context

安卓(Android Activity)的上下文。

avatarSDKListener

AvatarSDKListener

SDK状态回调,详见参考“回调及监听”章节。

avatarInstanceInfo

AvatarInstanceInfo

构建Avatar实例的基本配置信息,完整参数见AvatarInstanceInfo

options

AvatarOptions

自定义的配置信息,包括WebSocket地址、音频3A算法配置等,完整参数配置见AvatarOptions

AvatarInstanceInfo

数字人应用基本信息,参数可由虚拟数字人开放平台-开发者信息获取

名称

类型

必填

描述

示例值

tenantId

String

租户id

10000

appId

String

应用id

1234ab56cd

sessionId

String

会话id

123a567b-8d9e-0fgh-ab1c-2345de6f7efg

token

String

创建互动数字人实例时必填

鉴权token ,注意是StartInstance外层返回的token,不是channel里的token

0202e9b8cf531740ac782e4c35e06c795941e88941e3ae1e46ec61c1fbf58a3a

channel

object

webrtc鉴权信息,详见Channel

Channel

DingRTC所需要的鉴权信息,所有参数均可由StartInstance接口获得。

名称

类型

必填

描述

示例值

channelId

String

频道ID

108293819

token

String

DingRTC令牌码。

e59f61b2482b4d0562ab542da3f824f7

appId

String

DingRTC应用id

ONEX7E28C7C221854

userId

String

DingRTC生成的UserId

userId

nonce

String

DingRTC服务器生成的随机字符串

CK-9b5c335b9ae75879441ee7b363886418

expiredTime

ulong

DingRTC通道到期时间

1674128130551

AvatarOptions

高级功能自定义配置

名称

类型

必填

描述

默认值

wsUrl

String

建立im连接的websocket地址

wss://avatar-im.console.aliyun.com/ws

autoStartRecord

boolean

是否在初始化完成后自动开启录音

false

interval

int

音频采集间隔,单位毫秒,取值范围:60 - 1000,超出取值范围会直接抛出运行时异常

100

autoDodge

boolean

是否开启音频闪避

false

aecConfig

int

AEC配置,取值范围为:

AvatarOptions.AEC_NONE 不开启AEC

AvatarOptions.AEC_RTC使用WebRTCAEC能力

AvatarOptions.AEC_SYSTEM 使用系统自带AEC(部分机型不支持)

超出取值范围会直接抛出运行时异常

AvatarOptions.AEC_SYSTEM

audioSampleRate

int

音频采样率,取值范围为:

AvatarOptions.SAMPLE_RATE_8K

AvatarOptions.SAMPLE_RATE_16K

超出取值范围会直接抛出运行时异常

AvatarOptions.SAMPLE_RATE_16K

customAudioSource

boolean

是否开启自定义采集,默认false。

false

maxReconnectTimeout

long

断线重连最大尝试时间,超出这个时间仍未重连成功将抛出断线重连超时错误。单位毫秒。

300000

decodeMode

enum

可根据场景需求切换解码方式,使用硬件解码可降低一定的CPU负载。

警告

1.2.2版本升级后,该参数不再生效,由RTC自适应调整解码方式

AvatarOptions.DecodeMode.SOFTWARE_DECODE

初始化

初始化调用会执行以下操作:

  1. 建立websocket连接,初始化数字人交互能力

  2. 进入rtc频道,拉取云端数字人音视频流

AvatarSDK avatarSDK = AvatarSDK.createDialogAvatarInstance(this, avatarSDKListener, avatarInstanceInfo,options);
avatarSDK.init();

回调及监听

回调绑定

  • 初始化绑定

private AvatarSDKListener avatarSDKListener = new AvatarSDKListener() {}

@Override
protected void onCreate(Bundle savedInstanceState) {
	AvatarSDK avatarSDK = AvatarSDK.createDialogAvatarInstance(this, avatarSDKListener, avatarInstanceInfo, options);
	avatarSDK.init();
}
  • 除了在构造函数绑定监听回调外,还可以通过实例实时绑定监听回调;

private AvatarSDKListener avatarSDKListener = new AvatarSDKListener() {}

@Override
protected void onCreate(Bundle savedInstanceState) {
	AvatarSDK avatarSDK = AvatarSDK.createDialogAvatarInstance(this, avatarSDKListener, avatarInstanceInfo, options);
	avatarSDK.setAvatarSDKListener(avatarSDKListener);
	avatarSDK.init();
}
重要

建议在初始化操作init()执行前绑定监听回调,否则可能会出现回调没有被触发的情况;

回调方法说明

API

描述

支持的最低版本

onInitSuccess

SDK初始化完成

1.0.0

onRecordingStart

收音开始回调

1.0.0

onRecordingStop

收音结束回调

1.0.0

onAsr

ASR识别文本回调

1.0.0

onAnswer

数字人回答文本回调

1.0.0

onError

错误回调

1.0.0

onUnknown

扩展回调

1.0.0

  • onInitSuccess:初始化成功回调

onInitSuccess(String uid, DingRtcAudioTrack audioTrack, DingRtcVideoTrack videoTrack);

参数

类型

描述

uid

String

数字人用户ID。

audioTrack

DingRtcAudioTrack

数字人用户发生变化后的音频流。

videoTrack

DingRtcVideoTrack

数字人用户发生变化后的视频流。

  • onRecordingStart:收音开始回调

public void onRecordingStart();
  • onRecordingStop:收音结束回调

public void onRecordingStop();
  • onAsr:ASR识别文本回调

public void onAsr(String asrResult,String sentenceId);

参数

类型

描述

asrResult

String

ASR识别文本

sentenceId

String

句子id

  • onAnswer:数字人回答文本回调

public void onAnswer(String answerResult, String sentenceId);

参数

类型

描述

answerResult

String

数字人回答文本

sentenceId

String

句子id

  • onError:错误回调

public void onError(int errorCode,String source, String errorMsg);

参数

类型

描述

errorCode

int

错误码

source

String

错误来源

errorMsg

String

错误信息

  • onUnknown:扩展回调,由IM消息通道下发的,不属于上述任何类型的数据,均会通过onUnknown对外回调

public void onUnknown(String msg);

参数

类型

描述

msg

String

可扩展的数据字段

开始收音

开始使用麦克风采集音频数据,并向服务端发送数据,自定义采集模式下不可用

avatarSDK.startRecording();

结束收音

停止使用麦克风采集音频数据,并停止向服务端发送数据,自定义采集模式下不可用

avatarSDK.stopRecording();

文本互动

使用文本与数字人进行对话互动。

avatarSDK.sendMessage("你好");

高级功能

获取原始DingRtcEngine对象

获取原始DingRtcEngine对象,可使用RTC高级功能

DingRtcEngine mAliRtcEngine = avatarSDK.getAliRtcEngine();

设置DingRtcEngine的回调监听

  • 本地用户行为回调

//注意使用avatarSDK实例,而非DingRTCEngine原始对象
avatarSDK.setRtcEngineEventListener(new AvatarRtcEngineEventListener(context) {
    @Override
    public void onJoinChannelResult(int result, String channel, String userId, int elapsed) {
        //必须调用super方法,否则AvatarSDK断线重连功能无法正常工作
        super.onJoinChannelResult(result, channel, userId, elapsed);
    }

    @Override
    public void onConnectionStatusChange(DingRtcEngine.DingRtcConnectionStatus status, DingRtcEngine.DingRtcConnectionStatusChangeReason reason) {
        //必须调用super方法,否则AvatarSDK断线重连功能无法正常工作
        super.onConnectionStatusChange(status, reason);
    }

    @Override
    public void onOccurError(int error, String message) {
        //必须调用super方法,否则AvatarSDKListener无法抛出相关异常信息
        super.onOccurError(error, message);
    }
    
    @Override
    public void onAudioVolumeIndication(List<DingRtcAudioVolumeInfo> speakers) {
        super.onAudioVolumeIndication(speakers);
    }
});
重要

建议使用以下方法获取DingRtcEngine的状态回调,请勿直接调用DingRtcEngine的接口,否则会引起AvatarSDK的功能异常。

  • 远端用户行为回调

setRtcEngineEventListener(new AvatarRtcEngineEventListener() {
    @Override
    public void onJoinChannelResult(int result, String channel, String userId, int elapsed) {
        super.onJoinChannelResult(result, channel, userId, elapsed);
        Log.d(TAG, "onJoinChannelResult:" + result + ";channel:" + channel);
    }

    @Override
    public void onConnectionStatusChanged(DingRtcEngine.DingRtcConnectionStatus status, DingRtcEngine.DingRtcConnectionStatusChangeReason reason) {
        super.onConnectionStatusChanged(status, reason);
    }

    @Override
    public void onOccurError(int error, String message) {
        super.onOccurError(error, message);
    }

    @Override
    public void onAudioVolumeIndication(List<DingRtcAudioVolumeInfo> speakers) {
        super.onAudioVolumeIndication(speakers);
    }
});
  • 获取音频裸数据回调,替代DingRtcEngine().registerAudioObserver()

avatarSDK.setAvatarRtcAudioObserver(new AvatarRtcAudioObserver() {
    @Override
    public void onCaptureRawData(DingRtcAudioFrame aliRtcAudioSample) {
        
    }

    @Override
    public void onCaptureData(DingRtcAudioFrame aliRtcAudioSample) {

    }

    @Override
    public void onRenderData(DingRtcAudioFrame aliRtcAudioSample) {

    }

    @Override
    public void onPlaybackAudioFrameBeforeMixing(String s, DingRtcAudioFrame aliRtcAudioSample) {

    }
});
  • 音量回调,替代DingRtcEngine().registerAudioVolumeObserver()

    重要

    SDK 1.2.2之后请使用setRtcEngineEventListener监听音量回调

音频闪避

自动检测RTC视频流数字人说话暂停收音,默认关。

  • 初始化开启:

AvatarOptions options = new AvatarOptions.Builder().autoDodge(true).build();
AvatarSDK avatarSDK = AvatarSDK.createDialogAvatarInstance(this, avatarSDKListener, avatarInstanceInfo, options);
  • 运行时开启:

avatarSDK.setAutoDodge(true);
  • 关闭:

avatarSDK.setAutoDodge(false);

自定义采集

发送业务自定义采集的音频数据

avatarSDK.sendAudioBuffer(buffer);
重要
  • 如果采集间隔<60ms 或者采集间隔>1000ms,会触发运行时错误

  • 在启用自定义采集时,开始收音、结束收音、音频闪避、回声消除功能将不生效,onRecordingStartonRecordingStop回调也不会触发

销毁实例

断开rtc拉流、断开im连接、停止录音,销毁客户端实例;

avatarSDK.destory();
重要

该方法仅仅销毁客户端实例,若要避免云端资源浪费,请调用OpenAPIStopInstance接口

播报数字人

新建一个实例

AvatarSDK avatarSDK = AvatarSDK.createBroadcastAvatarInstance(context,
                                                           avatarSDKListener,
                                                           avatarInstanceInfo,
                                            			   options);
重要

必须在主线程中调用构造方法

参数说明

参数

类型

必填

描述

context

Context

安卓(Android Activity)的上下文。

avatarSDKListener

AvatarSDKListener

SDK状态回调,详见回调与监听

avatarInstanceInfo

AvatarInstanceInfo

构建Avatar实例的基本配置信息,完整参数见AvatarInstanceInfo

options

AvatarOptions

自定义的配置信息,包括断线重连超时时间等,完整参数配置见AvatarOptions

AvatarInstanceInfo

数字人应用基本信息,参数可由虚拟数字人开放平台-开发者信息获取

名称

类型

必填

描述

示例值

tenantId

String

租户id

10000

appId

String

应用id

1234ab56cd

sessionId

String

会话id

123a567b-8d9e-0fgh-ab1c-2345de6f7efg

channel

object

webrtc鉴权信息,详见Channel

Channel

DingRTC所需要的鉴权信息,所有参数均可由StartInstance接口获得。

名称

类型

必填

描述

示例值

channelId

String

频道ID

108293819

token

String

DingRTC令牌码。

e59f61b2482b4d0562ab542da3f824f7

gslb

array

DingRTC通道地址

["https://rgslb.rtc.aliyuncs.com"]

appId

String

DingRTC应用id

ONEX7E28C7C221854

userId

String

DingRTC生成的UserId

userId

nonce

String

DingRTC服务器生成的随机字符串

CK-9b5c335b9ae75879441ee7b363886418

expiredTime

ulong

DingRTC通道到期时间

1674128130551

AvatarOptions

高级功能自定义配置

名称

类型

必填

描述

默认值

maxReconnectTimeout

long

断线重连最大尝试时间,超出这个时间仍未重连成功将抛出断线重连超时错误。单位毫秒。

300000

decodeMode

enum

可根据场景需求切换解码方式,使用硬件解码可降低一定的CPU负载。

警告

1.2.2版本升级后,该参数不再生效,由RTC自适应调整解码方式

AvatarOptions.DecodeMode.SOFTWARE_DECODE

初始化

初始化调用会执行"进入rtc频道,拉取云端数字人音视频流".

AvatarSDK avatarSDK = AvatarSDK.createBroadcastAvatarInstance(this, avatarSDKListener, avatarInstanceInfo, null);
avatarSDK.init();

回调及监听

回调绑定

  • 初始化绑定

private AvatarSDKListener avatarSDKListener = new AvatarSDKListener() {}

@Override
protected void onCreate(Bundle savedInstanceState) {
	AvatarSDK avatarSDK = AvatarSDK.createBroadcastAvatarInstance(this, avatarSDKListener, avatarInstanceInfo, options);
	avatarSDK.init();
}

  • 除了在构造函数绑定监听回调外,还可以通过实例实时绑定监听回调;

private AvatarSDKListener avatarSDKListener = new AvatarSDKListener() {}

@Override
protected void onCreate(Bundle savedInstanceState) {
	AvatarSDK avatarSDK = AvatarSDK.createBroadcastAvatarInstance(this, avatarSDKListener, avatarInstanceInfo, options);
	avatarSDK.setAvatarSDKListener(avatarSDKListener);
	avatarSDK.init();
}
重要

建议在初始化操作init()执行前绑定监听回调,否则可能会出现回调没有被触发的情况;

回调方法说明

API

描述

支持的最低版本

onInitSuccess

SDK初始化完成

1.0.0

onError

错误回调

1.0.0

onUnknown

扩展回调

1.0.0

  • onInitSuccess:初始化成功回调

public void onInitSuccess(String uid, DingRtcAudioTrack audioTrack, DingRtcVideoTrack videoTrack);

参数

类型

描述

uid

String

数字人用户ID。

audioTrack

DingRtcAudioTrack

数字人用户发生变化后的音频流。

videoTrack

DingRtcVideoTrack

数字人用户发生变化后的视频流。

  • onError:错误回调

public void onError(int errorCode,String source, String errorMsg);

参数

类型

描述

errorCode

int

错误码

source

String

错误来源

errorMsg

String

错误信息

  • onUnknown:扩展回调,由IM消息通道下发的,不属于上述任何类型的数据,均会通过onUnknown对外回调

public void onUnknown(String msg);

参数

类型

描述

msg

String

可扩展的数据字段

高级功能

获取原始DingRtcEngine对象

获取原始DingRtcEngine对象,可使用RTC高级功能

DingRtcEngine mAliRtcEngine = avatarSDK.getAliRtcEngine();

设置DingRtcEngine的回调监听

重要

建议使用以下方法获取DingRtcEngine的状态回调,请勿直接调用DingRtcEngine的接口,否则会引起AvatarSDK的功能异常

  • 本地用户行为回调

//注意使用avatarSDK实例,而非DingRTCEngine原始对象
avatarSDK.setRtcEngineEventListener(new AvatarRtcEngineEventListener() {
    @Override
    public void onJoinChannelResult(int result, String channel, String userId, int elapsed) {
        super.onJoinChannelResult(result, channel, userId, elapsed);
        Log.d(TAG, "onJoinChannelResult:" + result + ";channel:" + channel);
    }

    @Override
    public void onConnectionStatusChanged(DingRtcEngine.DingRtcConnectionStatus status, DingRtcEngine.DingRtcConnectionStatusChangeReason reason) {
        super.onConnectionStatusChanged(status, reason);
    }

    @Override
    public void onOccurError(int error, String message) {
        super.onOccurError(error, message);
    }

    @Override
    public void onAudioVolumeIndication(List<DingRtcAudioVolumeInfo> speakers) {
        super.onAudioVolumeIndication(speakers);
    }
});
  • 远端用户行为回调

//注意使用avatarSDK实例,而非DingRTCEngine原始对象
avatarSDK.setRtcEngineEventListener(new AvatarRtcEngineEventListener() {
    @Override
    public void onJoinChannelResult(int result, String channel, String userId, int elapsed) {
        super.onJoinChannelResult(result, channel, userId, elapsed);
        Log.d(TAG, "onJoinChannelResult:" + result + ";channel:" + channel);
    }

    @Override
    public void onConnectionStatusChanged(DingRtcEngine.DingRtcConnectionStatus status, DingRtcEngine.DingRtcConnectionStatusChangeReason reason) {
        super.onConnectionStatusChanged(status, reason);
    }

    @Override
    public void onOccurError(int error, String message) {
        super.onOccurError(error, message);
    }

    @Override
    public void onAudioVolumeIndication(List<DingRtcAudioVolumeInfo> speakers) {
        super.onAudioVolumeIndication(speakers);
    }
});

销毁实例

断开rtc拉流、断开im连接、停止录音,销毁客户端实例;

重要

该方法仅仅销毁客户端实例,若要避免云端资源浪费,请调用OpenAPIStopInstance接口

avatarSDK.destory();

错误码表

音视频服务错误

触发onError回调时,source字段包含"Rtc"时,标志为RTC错误,详见《DingRTC错误码表》。

数字人服务错误

触发onError回调时,source字段为"Avatar"时,标志为数字人服务错误,详见下表

错误码

错误消息

描述

50009999

系统内部错误

内部未明确错误,需要通过日志文件寻求支持

50000001

缺少必填参数:audio

缺少必填参数

50000002

非法参数:audio

非法参数

50000006

无效的sessionId

无效的sessionId

50010001

发送的音频大小超过限制

发送的音频大小超过限制(默认最大为1sPCM音频)

50010002

互动数字人相关必要配置缺失

互动数字人相关必要配置缺失

50010003

互动机器人问答结果为空

互动机器人问答结果为空

50010004

天气预报机器人请求次数已达上限

天气预报机器人请求次数已达上限

50020001

ASR处理未知异常

ASR处理未知异常

50020002

ASR长时间未收到对应的正确格式音频

ASR长时间未收到对应的正确格式音频

50040001

云小蜜给出的errcode:errMsg

无权限访问对应云小蜜资源

50040002

云小蜜给出的errcode:errMsg

配置的云小蜜账号已被冻结

50040004

云小蜜给出的errcode:errMsg

云小蜜对话未知异常

15011000

服务端双工对话开启失败

IM通道建立后,初始化对话通道失败

15011001

IM通道异常

可能的原因:websocket地址出错、服务端拒绝了websocket连接、使用了不可信的SSL证书

15011002

IM断线

IM因网络问题断开连接

15011003

IM重连超时

IM断线后超出最大重连时间仍未重连成功,接收到此回调时需要调用destroy接口销毁实例,再重新初始化

15021000

rtc频道关闭

相同实例在另一个端登录

15021001

rtc重连超时

rtc断线后超出最大重连时间仍未重连成功,接收到此回调时需要调用destroy接口销毁实例,再重新初始化

15031000

数字人类型错误

数字人类型错误,调用了当前数字人不支持的接口方法

15031001

自定义采集配置冲突

自定义采集配置冲突,如开启了自定义采集的同时调用StartRecord接口

15031002

未获取到录音权限

请检查麦克风设备是否正常运行,或者浏览器麦克风权限是否做了限制

常见问题

  1. 目前拉到的流是一个全屏大小的流,如何适配到自定义尺寸的容器中?

    需要对容器的布局属性进行调整。参考DemoAvatarActivity的设置方法。若没有开启透明背景,可以修改updateRemoteDisplay方法中的LayoutParams来进行调整;若开启了透明背景,则需要修改 updateRemoteDisplayByGreenBackground 方法中的LayoutParams来调整。因为视频流的比例是固定的,建议等比缩放试,使用其他比例的容器布局可能会有裁剪。示例代码如下:

    RelativeLayout.LayoutParams layout = new RelativeLayout.LayoutParams(1080, 1920);