Android SDK 接入指南

一、开发环境与源码准备

1. 安装开发工具

安装 & 配置 Android Studio


MacOS

Windows

教学链接

Mac 上 Android Studio 的安装与配置指南

Android Studio 安装配置教程 - Windows

2. 快速体验demo

Android 压缩包附带的 apk 文件中是虚拟人 demo 的安装包,可以直接安装到 Android 手机上。并快速体验在您的手机上的表现。

获取方式:
GitHub:https://github.com/publicize0828/XmovLiteAvatarAndroidDemo
Gitee:https://gitee.com/xmovmaster/XmovLiteAvatarAndroidDemo

Android 压缩包附带的 demo 文件夹中是虚拟人的示例工程,使用 Android studio 打开示例工程,完成以下步骤配置,然后直接运行起来测试:

a. 替换 demo_configs.json 中的 appid 和 appSecret
b. demo_configs.json 中的 config 按需配置
c. MockAudioInputsData.json 是支持自行输入音频数据的示例格式

二、依赖配置与系统声明

1. 将开发包拷贝到工程

将SDK中libs目录下的aar包拷贝到自己工程的libs目录下,如没有该目录需新建。

在app文件夹下的build.gradle的dependencies中配置对应版本的aar依赖详细代码如下:

implementation files('libs/xmovdigitalhuman-xxx.aar')

2. 添加外部第三方依赖 详细代码如下:

    implementation "javax.vecmath:vecmath:1.5.2"
implementation "com.google.code.gson:gson:2.13.1"
implementation "com.squareup.okhttp3:okhttp:5.1.0"
implementation "org.msgpack:msgpack-core:0.9.3"
implementation "io.socket:socket.io-client:2.1.0"
// Protobuf 依赖
implementation("com.google.protobuf:protobuf-javalite:3.21.12")
// ExoPlayer dependency for WebM/Opus streaming
implementation "androidx.media3:media3-exoplayer:1.9.0"

根 build.gradle.kts文件中增加protobuf相关配置

3. 校验系统自带依赖

确保当前工程的构建脚本中已包含以下核心系统组件与测试框架。

Android 自带的依赖

分类

依赖坐标

说明

AndroidX 核心

androidx.appcompat:appcompat:1.7.1

兼容库

androidx.core:core-ktx:1.10.1 / 1.17.0

Kotlin 扩展

androidx.activity:activity:1.11.0

Activity 组件

androidx.preference:preference:1.2.0

设置界面

UI 组件

androidx.constraintlayout:constraintlayout:2.2.1

约束布局

com.google.android.material:material:1.13.0

Material Design

测试框架

junit:junit:4.13.2

单元测试

androidx.test.ext:junit:1.3.0

Android 测试

androidx.test.espresso:espresso-core:3.5.1

UI 测试

4. 配置AndroidManifest.xml文件

在manifest标签内添加必要的权限支持

<uses-permission android:name="android.permission.INTERNET"/>

5. 混淆规则

-keep public class com.xmov.metahuman.sdk.data.**{*;}
-keep public class com.xmov.metahuman.sdk.impl.data.**{*;}
-keep public class com.xmov.metahuman.sdk.impl.transport.http.**{*;}
-keep public interface com.xmov.metahuman.sdk.IXmovAvatar {*;}
-keep class com.xmov.metahuman.sdk.IXmovAvatar$Companion { *;}
-keep public interface com.xmov.metahuman.sdk.IAvatarListener {
public protected *;
}
-keep public interface com.xmov.metahuman.sdk.PreCacheListener {
public protected *;
}

通过上面的几个步骤,工程就配置完成了,接下来就可以在工程中使用虚拟人SDK进行开发了。

三、SDK 初始化与回调接管

1. 初始化

使用SDK功能前,必须先进行初始化操作。

方法原型

fun init(
context: Context,
layout: ViewGroup,
initConfig: InitConfig,
listener: IAvatarListener?
)

参数描述

参数

类型

说明

context

Context

一般传Activity对象

layout

ViewGroup

加载虚拟人所在的父布局

initConfig

InitConfig

初始化配置类

listener

IAvatarListener

回调监听

InitConfig 类介绍

参数

类型

说明

appId

String

星云具身中应用对应的appId

appSecret

String

星云具身中应用对应的appSecret

gatewayServer

String

进入房间的地址:"https://nebula-agent.xingyun3d.com/user/v1/ttsa/session"

config

String

json string 设置一些配置项

在初始化监听器中,需接管以下核心底层事件流:

回调方法与参数

核心参数数据类型

业务状态说明

onInitEvent

code: Int
message: String?

初始化状态。code 为 0 表示成功,其他状态码表示失败

onWidgetEvent

widgetData: IRawEventFrameData?

渲染与字幕事件。内部包含起始帧与事件数组(如 subtitle_on 标识字幕触发及对应的文本)

onVoiceStateChange

status: String?

音频流状态。voice_start 表示播报开始,voice_end 表示播报结束

onReconnectEvent

code: Int
message: String?

底层重连状态。code 为 0 表示重连成功,其他状态码表示失败

     IXmovAvatar.get().init(this, mBinding.avatarLayout, initConfig.appId, initConfig.appSecret,initConfig.gatewayServer,object : IAvatarListener {
override fun onInitEvent(code: Int, message: String?) {
LogUtil.d("onInitEvent code:$code,message:$message")
}

override fun onWidgetEvent(widgetData: IRawEventFrameData?) {
LogUtil.d("onWidgetEvent widgetData:$widgetData")
}

override fun onNetworkInfo(sdkNetworkInfo: SDKNetworkInfo?) {
LogUtil.d("onNetworkInfo $sdkNetworkInfo")
}

override fun onMessage(sdkMessage: SDKMessage?) {
LogUtil.d("onMessage $sdkMessage")
}

override fun onStateChange(state: String?) {
LogUtil.d("onStateChange $state")
}

override fun onStatusChange(status: SDKStatus?) {
LogUtil.d("onStatusChange $status")
}

override fun onStateRenderChange(state: String?, duration: Long) {
LogUtil.d("onStateRenderChange state:$state,duration:$duration")
}

override fun onVoiceStateChange(status: String?) {
LogUtil.d("onVoiceStateChange state:$status")
runOnUiThread {
if ("voice_end" == status) {
} else if ("voice_start" == status) {
}
}
}

override fun onDebugInfo(debugInfo: JSONObject) {
// LogUtil.d("onDebugInfo debugInfo:$debugInfo")
}

override fun onReconnectEvent(code: Int, message: String?) {
toast("重连:code=$code message=$message")
}

override fun onOfflineEvent() {
toast("进入离线状态")
}
})

2. 初始化回调

onInitEvent(code: Int, message: String?)

方法返回参数分为外层code和result,含义如下:

字段

类型

含义

code

Int

Code 0:成功;其他:失败

message

String

返回信息

3. 事件回调(字幕回调)

onWidgetEvent(widgetData: IRawEventFrameData?)

IRawEventFrameData实体类

字段

类型

含义

startFrame

Int

开始帧

event

JSONArray

type: subtitle_on 字幕类型,text 字幕文案

4. 声音播报回调

onVoiceStateChange(status: String?)

字段

类型

含义

status

String

voice_start 播报开始 voice_end 播报结束

5. 重连在线模式回调

onReconnectEvent(code: Int, message: String?)

字段

类型

含义

code

Int

code为0:成功;其他:失败

message

String

返回信息

6. SDK在运行过程中的错误回调

可在该回调中,进行重新初始化逻辑,保证设备长期运行

onSDKRuntimeError(code: Int, message: String?)

字段

类型

含义

code

Int

错误code码

message

String

错误信息

7. speak事件回调

返回speak事件的开始,结束,错误状态

onSpeakStateChange(speakState: String?,clientSpeakId: String?,errorMsg: String?)

字段

类型

含义

speakState

String

speak事件状态 speak_start speak_end speak_error

clientSpeakId

String

speakid,可在调用speak时传入,不传内部自动生成一个id

errorMsg

String

错误信息 仅在speakState为speak_error下返回




四、全局参数配置对象

在进行初始化时,initConfig中的config是一个json 字符串,可以定制化做一些配置

1. config配置

在进行初始化时,initConfig中的config是一个json 字符串,可以定制化做一些配置config字段名介绍

字段名

数据类型

说明

默认值

示例值

input_audio

boolean

是否开启自己的音频输入true为开启,false为关闭(sdk内部的音频输入)

FALSE

FALSE

output_audio

boolean

是否开启SDK内音频输出true为使用sdk内部音频输出false不使用sdk内部音频输出

TRUE

TRUE

max_reconnect_count

Int

最大重连次数(默认5次)断网情况下会切换到离线模式,当sdk检测到有网会进行重连

5

5

render_time_out

Int

视频渲染超时阈值(默认15秒)

15

15

resolution

JSONObject

分辨率配置对象,用于定义画面的宽高参数(跟随角色分辨率保持一致)

{"height": 1920, "width": 1080}

{"height": 1920, "width": 1080}

resolution.height

number

画面高度,单位为像素(px)

1920

1920

resolution.width

number

画面宽度,单位为像素(px)

1080

1080

layout

LayoutConfig

数字人布局配置结构化对象



2. LayoutConfig介绍

(1)container(容器配置)

字段名

数据类型

说明

默认值

示例值

size

Int[]

容器尺寸,数组第一位为宽度,第二位为高度


[1080, 1920]

(2)avatar(数字人布局配置)

注意:align需要容器为约束布局ConstraintLayout 类型生效

字段名

数据类型

取值范围

说明

默认值

示例值

v_align

string

"top" / "middle" / "bottom"

数字人在容器内的垂直对齐方式(vertical align),控制数字人在容器垂直方向的位置(容器为约束布局ConstraintLayout 类型生效)

"middle"

"middle"

h_align

string

"left" "center" "right"

数字人在容器内的水平对齐方式(horizontal align),控制数字人在容器水平方向的位置(容器为约束布局ConstraintLayout 类型生效)

"center"

"center"

scale

Float

>0

数字人缩放比例,1 为原始尺寸,0.5 为缩小至 50%,大于 1 为放大

1

0.5

offset_x

number

任意数值

数字人在水平对齐基础上的偏移量(正数向右,负数向左)

0

20

offset_y

number

任意数值

数字人在垂直对齐基础上的偏移量(正数向下,负数向上)

0

20

4. 配置示例

{
"max_reconnect_count": 5,
"render_time_out": 12,
"input_audio": false,
"output_audio": true,
"resolution": {
"width": 1080,
"height": 1920
},
"layout": {
"container": {
"size": [1080, 1920]
},
"avatar": {
"h_align": "center",
"v_align": "middle",
"scale": 1,
"offset_x": 0,
"offset_y": 0
}
}
}

五、核心能力与状态控制

1. Speak

方法原型参数说明

参数

参数类型

说明

ssml(必填)

String

传入说话内容的文本信息(支持ka动作)

isStart(必填)

boolean

是否开始节点

isEnd(必填)

boolean

是否输入结束

enableSpeechCache(可选)

boolean?

是否启用缓存(默认null)

clientSpeakId(可选)

String?

当前会话的speak id (默认null)

支持全文本和流式文本输入

(1)全文本输入时代码示例:

IXmovAvatar.get().speak("welcomeMessage", true, true, false,null)

(2) 流式文本输入时代码示例

//开头
IXmovAvatar.get().speak("msg 1", true, false, false,null)
IXmovAvatar.get().speak("msg 2", false, false, false,null)
...
//结尾
IXmovAvatar.get().speak("msg 2", false, true, false,null)

2. 虚拟人常用的一下动作状态切换

1.倾听

代码示例

IXmovAvatar.get().listen()

2.思考

代码示例

IXmovAvatar.get().think()

3.打断

代码示例

IXmovAvatar.get().interrupt()

3. 断线

重连本sdk支持,当网络波动或者无网情况下,自动进入离线状态,当有网络时会自动重连。也支持客户手动切换到离线状态,然后再重连(注意 重连只能是离线状态下进行重连,其他状态进行重连会报错)方法原型

fun switchModel(isOffline: Boolean)

参数说明

参数

参数类型

说明

isOffline(必填)

Boolean

true:切换到离线模式false:进行重连到在线模式

示例代码

IXmovAvatar.get().switchModel(true) 

4. 销毁

销毁sdk实例,断开连接 进行资源释放。虚拟人退出时调用方法原型

  fun destroy()

示例代码

IXmovAvatar.get().destroy()

5. 日志开关

在调试阶段可以打开日志,方便分析问题,应用发布时可关闭日志,提升性能,默认是打开日志的关闭日志方法原型

fun hideDebugInfo()

示例代码

IXmovAvatar.get().hideDebugInfo()

打开日志方法原型

fun showDebugInfo()

示例代码

IXmovAvatar.get().showDebugInfo()

六、底层驱动引擎替换

只针对带唤醒的demo工程

1. 唤醒词

更换唤醒词,需要提供讯飞的sdk包

1. 解压讯飞唤醒sdk的压缩包,在项目源码中替换 ivw中的xxx.jet文件
2. 代码中需要修改唤醒词字符串匹配规则

2. 换LLM

1. 更换对应llm厂商的apikey,defaultMode, defaultPointID(豆包)

2. 重新实现llm流式返回实现

3. 换ASR

1. asr 厂商的一些常量设置

2. 代码实现

七、工程调试与终端构建

1. 调试与运行

模拟器

Step 1

Step 2

Step 3

真机

Step 1

Step 2

2. 打包

环境准备

本项目需要安装 JDK 11 或更高版本。

为了获得最佳的构建兼容性,推荐使用 Java 17Java 21

如果未安装 JDK,可参考以下教程:

JDK 17 安装教程
JDK 21 安装教程

基础机制

打包流程主要通过执行项目根目录下的 ./gradlew 脚本完成。该脚本会自动下载并匹配项目所需的 Gradle 版本,无需手动配置 Gradle 环境。

打包流程

1. 定位目录:在终端中,确保当前路径已定位至项目根目录。

  1. 执行指令:输入以下命令开始打包:
./gradlew bundleRelease

输出文件位置

构建命令执行成功后,终端会显示 "BUILD SUCCESSFUL"。此时生成的发布包位于项目的 build 目录下。

文件路径:app/build/outputs/apk/release/

常见问题与注意事项

权限问题 如果您在打包时遇到 Permission denied 或类似权限问题,请先在终端执行以下命令赋予脚本执行权限:

chmod +x gradlew

⚠️ 最佳实践

编译清理:建议在打包 Release 版本前先执行 clean 指令,确保包体内不包含旧代码缓存。
多任务合并:您可以一次性执行清理和打包,命令如下:

./gradlew clean assembleRelease

八、错误排查与兼容矩阵

1. 返回码

该返回码为虚拟人SDK自身的返回码,具体错误在碰到之后查阅主要用于onInitEvent、onReconnectEvent、onSDKRuntimeError回调

返回码

返回码描述

0

成功

1000

进入房间失败(包含服务端接口返回的报错,json解析报错)

1001

正在初始化中,请稍后再试(仅在onInitEvent回调中)

1002

视频帧渲染超时(仅在onSDKRuntimeError回调中)

1003

socket连接退出 (仅在onSDKRuntimeError回调中)

1004

断开socket连接

1005

同步时间帧发生错误

1006

加载charbin失败 (仅在onSDKRuntimeError回调中)

1007

服务升级

1008

暂无可用房间

1009

渲染失败(仅在onInitEvent回调中)

2000

在未成功初始化时执行其他状态操作 (仅在onMessage回调中)

3000

sdk 未在离线状态下进行重连 (仅在onReconnectEvent回调中)

2. 兼容性说明

设备类型

设备+型号

系统

屏幕类型

系统版本

是否测试

手机

Oppo Reno 13

Android

竖屏

15

手机

oppo k9 pro

Android

竖屏

13

手机

华为 nova13

HarmonyOS

竖屏

4.2.0

手机

vivo s20 pro

Android

竖屏

15

手机

红米turbo 4pro

Xiaomi HyperOS

竖屏

2.0.207.0

平板

华为

HarmonyOS

横屏

5.1.0.227

竖屏

平板

小米

Xiaomi HyperOS

横屏

2.0.14.0

竖屏

闺蜜机

竖屏


横屏


3566mini全息仓

竖屏


针对SDK兼容性已在上述设备进行测试(设备/操作系统/分辨率)

如有希望提供更多的设备兼容性测试信息,请联系我们:

Android SDK 接入指南
一、开发环境与源码准备
1. 安装开发工具
2. 快速体验demo
二、依赖配置与系统声明
1. 将开发包拷贝到工程
2. 添加外部第三方依赖 详细代码如下:
3. 校验系统自带依赖
4. 配置AndroidManifest.xml文件
5. 混淆规则
三、SDK 初始化与回调接管
1. 初始化
2. 初始化回调
3. 事件回调(字幕回调)
4. 声音播报回调
5. 重连在线模式回调
6. SDK在运行过程中的错误回调
7. speak事件回调
四、全局参数配置对象
1. config配置
2. LayoutConfig介绍
(1)container(容器配置)
(2)avatar(数字人布局配置)
4. 配置示例
五、核心能力与状态控制
1. Speak
2. 虚拟人常用的一下动作状态切换
3. 断线
4. 销毁
5. 日志开关
六、底层驱动引擎替换
1. 唤醒词
2. 换LLM
3. 换ASR
七、工程调试与终端构建
1. 调试与运行
模拟器
真机
2. 打包
环境准备
基础机制
打包流程
输出文件位置
常见问题与注意事项
八、错误排查与兼容矩阵
1. 返回码
2. 兼容性说明
文档是否有帮助?
有帮助
无帮助
咨询
预约
干货
客服