Android

开发者环境要求

最低兼容 Android 4.4(SDK API Level 19),建议使用 Android 7.0 (SDK API Level 24)及以上版本。
Android Studio 3.5 及以上版本。

Demo 工程: TEBeauty_API_Example

从 github clone 出 demo工程,其中的 TEBeautyDemo 是含 UI 的 demo 工程,TEBeauty_API_Example 是不含 UI 的 demo 工程。
按照 TEBeauty_API_Example/README 文档中的指引将 TEBeauty_API_Example 运行起来,然后结合本文了解无UI 集成 SDK 的详细步骤。

集成SDK

注意:
Github 上的 demo 工程采用 Maven 方式集成 SDK。
Maven 集成
手动集成(资源内置)
手动集成(资源动态下载)
腾讯特效 SDK 已经发布到 mavenCentral 库,您可以通过配置 gradle 自动下载更新。
1. 在 dependencies 中添加腾讯特效 SDK 的依赖。
dependencies {
//例如:S1-04套餐如下:
implementation 'com.tencent.mediacloud:TencentEffect_S1-04:版本号'
//“版本号”可以在官网的“SDK下载/版本历史”页面看到,例如 3.0.0.13。“版本号”也可以使用"latest.release" ,
//但请注意:这会让您使用的SDK始终保持最新版,在一些变化比较大的版本上可能不符合您的预期,请慎重使用"latest.release"
}
2. 在 defaultConfig 中,指定 App 使用的 CPU 架构。
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
说明:
目前特效 SDK 支持 armeabi-v7a 和 arm64-v8a。
3. 单击
img

Sync Now,自动下载 SDK 并集成到工程里。
各套餐对应的 Maven 地址
版本
Maven 地址
A1 - 01
implementation 'com.tencent.mediacloud:TencentEffect_A1-01:版本号'
A1 - 02
implementation 'com.tencent.mediacloud:TencentEffect_A1-02:版本号'
A1 - 03
implementation 'com.tencent.mediacloud:TencentEffect_A1-03:版本号'
A1 - 04
implementation 'com.tencent.mediacloud:TencentEffect_A1-04:版本号'
A1 - 05
implementation 'com.tencent.mediacloud:TencentEffect_A1-05:版本号'
A1 - 06
implementation 'com.tencent.mediacloud:TencentEffect_A1-06:版本号'
S1 - 00
implementation 'com.tencent.mediacloud:TencentEffect_S1-00:版本号'
S1 - 01
implementation 'com.tencent.mediacloud:TencentEffect_S1-01:版本号'
S1 - 02
implementation 'com.tencent.mediacloud:TencentEffect_S1-02:版本号'
S1 - 03
implementation 'com.tencent.mediacloud:TencentEffect_S1-03:版本号'
S1 - 04
implementation 'com.tencent.mediacloud:TencentEffect_S1-04:版本号'
S1 - 05
implementation 'com.tencent.mediacloud:TencentEffect_S1-05:版本号'
S1 - 06
implementation 'com.tencent.mediacloud:TencentEffect_S1-06:版本号'
S1 - 07
implementation 'com.tencent.mediacloud:TencentEffect_S1-07:版本号'

下载 SDK

下载 SDK,并解压。目录结构如下:




集成

SDK文件夹下的 xmagic-xxxx.aar 文件拷贝到您工程 libs 目录下。

导入方法

打开 app 模块的 build.gradle 添加依赖引用:
android{
...
defaultConfig {
applicationId "修改成与授权license绑定的包名"
....
}
packagingOptions {
pickFirst '**/libc++_shared.so'
}
}

dependencies{
...
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])//添加 *.aar
}
注意:
项目中还需添加如下依赖:
dependencies{
implementation 'com.google.code.gson:gson:2.8.2'
//版本在2.6.0到3.1.0.2 需要添加
implementation 'androidx.exifinterface:exifinterface:1.3.3'
//3.5.0 版本及之后需要添加
implementation 'com.tencent.tav:libpag:4.3.33-noffavc'
}

如果您想使用其他版本的 pag,请点击 此处 查看。

动态下载 assets、so、动效资源指引

为了减少包大小,您可以将 SDK 所需的 assets 资源、so 库、以及动效资源 MotionRes(部分基础版 SDK 无动效资源)改为联网下载。在下载成功后,将上述文件的路径设置给 SDK。
我们建议您复用 Demo 的下载逻辑,当然,也可以使用您已有的下载服务。动态下载的详细指引,请参见 SDK 包体瘦身(Android)

集成素材

如果您的套餐包含动效和滤镜功能,那么需要在 SDK 下载页面 下载对应的套餐包,解压之后,将resource目录下的lutMotionRes放置到您工程的assets目录下:
动效:..src/main/assets/MotionRes
滤镜:..src/main/assets/lut
更多素材配置可参考素材使用指南

SDK使用流程

步骤一:鉴权

1. 申请授权,得到 License URL 和 License KEY,请参见 License 指引
2. 在相关业务模块的初始化代码中设置 URL 和 KEY,触发 License 下载,避免在使用前才临时去下载。例如我们的 demo 工程是在 Application 的 onCreate 方法里触发下载,但在您的项目中不建议在这里触发,因为此时可能没有网络权限或联网失败率较高,请选择更合适的时机触发 license 下载。
//如果仅仅是为了触发下载或更新license,而不关心鉴权结果,则第4个参数传入null。
TELicenseCheck.getInstance().setXMagicLicense(context, URL, KEY, null);
3. 然后在真正要使用美颜功能前,再去做鉴权:
TELicenseCheck.getInstance().setTELicense(context, URL, KEY, new TELicenseCheckListener() {

@Override
public void onLicenseCheckFinish(int errorCode, String msg) {
//注意:此回调不一定在调用线程
if (errorCode == TELicenseCheck.ERROR_OK) {
//鉴权成功
} else {
//鉴权失败
}
}
});
鉴权 errorCode 说明:
错误码
说明
0
成功。Success
-1
输入参数无效,例如 URL 或 KEY 为空
-3
下载环节失败,请检查网络设置
-4
从本地读取的 TE 授权信息为空,可能是 IO 失败引起
-5
读取 VCUBE TEMP License文件内容为空,可能是 IO 失败引起
-6
v_cube.license 文件 JSON 字段不对。请联系腾讯云团队处理
-7
签名校验失败。请联系腾讯云团队处理
-8
解密失败。请联系腾讯云团队处理
-9
TELicense 字段里的 JSON 字段不对。请联系腾讯云团队处理
-10
从网络解析的 TE 授权信息为空。请联系腾讯云团队处理
-11
把TE授权信息写到本地文件时失败,可能是 IO 失败引起
-12
下载失败,解析本地 asset 也失败
-13
鉴权失败,请检查 so 是否在包里,或者已正确设置 so 路径
3004/3005
无效授权。请联系腾讯云团队处理
3015
Bundle Id / Package Name 不匹配。检查您的 App 使用的 Bundle Id / Package Name 和申请的是否一致,检查是否使用了正确的授权文件
3018
授权文件已过期,需要向腾讯云申请续期
其他
请联系腾讯云团队处理

步骤二:资源拷贝

这里所指的资源文件包含两部分:
SDK 的模型文件,位于 SDK 的 aar 包的 assets 目录。
滤镜和动效资源文件,位于 demo 工程的 assets 目录,命名分别是 lut 和 MotionRes。
使用美颜前需要将上述资源拷贝到 app 的私有目录。在未更新 SDK 版本的情况下,只需要拷贝一次。拷贝成功后,您可以在 App 的 SharedPreference 中记录下来,下次就不用再拷贝了。 具体可以参见 demo 工程的TEMenuActivity.java
String resPath = new File(getFilesDir(), AppConfig.getInstance().getBeautyFileDirName()).getAbsolutePath();
if (!resPath.endsWith(File.separator)) {
resPath = resPath + File.separator;
}
AppConfig.resPathForSDK = resPath;
AppConfig.lutFilterPath = resPath + "light_material/lut";
AppConfig.motionResPath = resPath + "MotionRes";


new Thread(() -> {
Context context = getApplicationContext();
int addResult = XmagicApi.addAiModeFilesFromAssets(context, AppConfig.resPathForSDK);
Log.d(TAG, "copyRes, add ai model files result = " + addResult);

String lutDirNameInAsset = "lut";
boolean result = FileUtil.copyAssets(context, lutDirNameInAsset, AppConfig.lutFilterPath);
Log.d(TAG, "copyRes, copy lut, result = " + result);

String motionResDirNameInAsset = "MotionRes";
boolean result2 = FileUtil.copyAssets(context, motionResDirNameInAsset, AppConfig.motionResPath);
Log.d(TAG, "copyRes, copy motion res, result = " + result2);
}).start();

步骤三:SDK 初始化及使用方法

1. 快速实现相机(可选)
我们假定您已经实现了相机应用,能正常启动相机,且能将相机的 SurfaceTexture 纹理信息回调到 Activity 用于美颜处理,如下所示:
@Override
public int onCustomProcessTexture(int textureId, int textureWidth, int textureHeight) {
//美颜SDK在这里处理textureId,为其添加美颜和特效,并返回处理后的新的textureID
}
如果您尚未实现相机应用,可以参见 demo 工程的 TECameraBaseActivity.java,使用GLCameraXView这个组件,将它添加到您的 Activity 的 layout 中,以快速实现相机预览:
<com.tencent.demo.camera.camerax.GLCameraXView
android:id="@+id/te_camera_layout_camerax_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:back_camera="false"
app:surface_view="false"
app:transparent="true" />
2. 初始化美颜 SDK,Demo工程在 Activity 的 onCreate()方法中初始化:
//AppConfig.resPathForSDK是资源拷贝环节确定的资源路径
mXmagicApi = new XmagicApi(this, AppConfig.resPathForSDK);
参数
参数
含义
Context context
上下文
String resDir
资源文件目录,详见请参见 步骤二
OnXmagicPropertyErrorListener errorListener
可选,回调函数实现类,用于回调SDK初始化和使用过程中的一些错误码,错误码含义请参见 API 文档
3. (可选)添加素材提示语回调函数(方法回调有可能运行在子线程),部分素材会提示用户:点点头、伸出手掌、比心,这个回调就是用于展示类似的提示语。
mXmagicApi.setTipsListener(new XmagicTipsListener() {
final XmagicToast mToast = new XmagicToast();
@Override
public void tipsNeedShow(String tips, String tipsIcon, int type, int duration) {
mToast.show(MainActivity.this, tips, duration);
}

@Override
public void tipsNeedHide(String tips, String tipsIcon, int type) {
mToast.dismiss();
}
});
4. 美颜 SDK 处理每帧数据并返回相应处理结果。process 方法详细说明见 API 文档
@Override public int onCustomProcessTexture(int textureId, int textureWidth, int textureHeight) { return mXmagicApi.process(textureId, textureWidth, textureHeight); }
5. 设置美颜或特效。
3.5.0版本及以后使用setEffect方法 方法详细说明见 API 文档
3.3.0版本及之前使用updateProperty方法详细说明见 API 文档
//3.5.0版本及之后使用此方法
mXmagicApi.setEffect(String effectName, int effectValue, String resourcePath, Map<String, String> extraInfo)
//例如设置美白属性,强度50
//mXmagicApi.setEffect(XmagicConstant.EffectName.BEAUTY_WHITEN, 50, null,null);

// 可用的入参属性可以从 XmagicResParser.parseRes() 获得
// 3.3.0版本及之前使用此方法
@Deprecated
mXmagicApi.updateProperty(XmagicProperty<?> p);
6. 生命周期方法onResume,建议在ActivityonResume()方法中调用,调用后会恢复特效里的声音。
mXmagicApi.onResume();
7. 生命周期方法onPause,建议在 Activity 的 onPause() 方法调用,调用后会暂停特效里的声音。
mXmagicApi.onPause();
8. 释放美颜 SDK,在OpenGL环境销毁时调用,需要在 GL 线程中调用,不能在主线程(Activity的onDestroy里)调用,否则可能造成资源泄露,多次进出后引起白屏、黑屏现象。
@Override public void onGLContextDestroy() { mXmagicApi.onDestroy(); }

步骤四:混淆配置

如果您在打 release 包时,启用了编译优化(把 minifyEnabled 设置为 true),会裁掉一些未在 java 层调用的代码,而这些代码有可能会被 native 层调用,从而引起 no xxx method 的异常。
如果您启用了这样的编译优化,那就要添加这些 keep 规则,防止 xmagic 的代码被裁掉:
-keep class com.tencent.xmagic.** { *;}
-keep class org.light.** { *;}
-keep class org.libpag.** { *;}
-keep class org.extra.** { *;}
-keep class com.gyailib.**{ *;}
-keep class com.tencent.cloud.iai.lib.** { *;}
-keep class com.tencent.beacon.** { *;}
-keep class com.tencent.qimei.** { *;}
-keep class androidx.exifinterface.** { *;}

附件(SDK 文件结构):

说明:
此表格列出了SDK用到的所有文件,可能您的套餐中没有某些文件,但并不影响该套餐功能的使用。
文件类型
说明
assets
audio2exp
avatar 虚拟人语音驱动模型,如果不使用该功能,则无需该模型
benchmark
机型适配使用
Light3DPlugin
3D 贴纸使用
LightBodyPlugin
LightBody3DModel.bundle
人体 3D 骨骼点位使用
LightBodyModel.bundle
美体功能使用
LightCore
SDK 核心模型资源
LightHandPlugin
手势贴纸、手部点位能力需要
LightSegmentPlugin
背景分割能力需要使用
lut
免费的滤镜资源
demo_xxx_android_xxxx

demo 工程
jniLibs
libace_zplan.so
3D 引擎库
libaudio2exp.so
avatar 虚拟人语音驱动库,如果不使用该功能,则无需该库
libc++_shared.so
libc++_shared.so 是一个 C++ 标准库的共享库,它提供了一组C++ 标准库函数和类,用于支持 C++ 程序的开发和运行。它在 Android 系统中被广泛使用,是 C++ 应用程序和库的重要组成部分。如果您的工程中已有 C++ 共享库,可以只保留一份
liblight-sdk.so
light sdk 核心库
libpag.so
light sdk 依赖的动画文件库
libtecodec.so
light sdk 依赖的编解码库
libv8jni.so
light sdk 依赖的用于解析 JavaScript 的库
libYTCommonXMagic.so
license 鉴权使用
libs
xmagic-xxxx.aar
美颜 SDK 的 aar 文件
MotionRes
2dMotionRes
2D 贴纸
3dMotionRes
3D 贴纸
avatarRes
Avatar素材
ganMotionRes
童趣贴纸
handMotionRes
手势贴纸
makeupRes
美妆贴纸
segmentMotionRes
背景分割贴纸
unity
aar
unity 项目需要使用的桥接 aar
module
桥接 aar 的原工程