Android

最近更新时间:2024-05-31 14:41:21

我的收藏

开发者环境要求

最低兼容 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 的详细步骤。

集成方式

:Github 上的 demo 工程采用 Maven 方式集成 SDK。
手动集成(资源内置)
手动集成(资源动态下载)
Maven 集成

下载 SDK

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




集成

SDK文件夹下的 xmagic-xxxx.aar 文件拷贝到您工程 libs 目录下。
resource文件夹下的lut拷贝到项目的 ../src/main/assets 目录下,如果 resource下的MotionRes 文件夹内有资源,将此文件夹也拷贝到 ../src/main/assets 目录下 。

导入方法

打开 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 版本及之后需要添加
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 已经发布到 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 并集成到工程里。
4. 如果您的套餐包含动效和滤镜功能,那么需要在 SDK 下载页面 下载对应的套餐包,解压之后,将resource目录下的lutMotionRes放置到您工程的assets目录下:
动效:..src/main/assets/MotionRes
滤镜:..src/main/assets/lut

各套餐对应的 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:版本号'

SDK 使用流程

步骤一:鉴权

1. 申请授权,得到 License URL 和 License KEY,请参见 License 指引
2. 在相关业务模块的初始化代码中设置 URL 和 KEY,触发 License 下载,避免在使用前才临时去下载。例如我们的 demo 工程是在 Application 的 onCreate 方法里触发下载,但在您的项目中不建议在这里触发,因为此时可能没有网络权限或联网失败率较高,请选择更合适的时机触发 license 下载。
//如果仅仅是为了触发下载或更新license,而不关心鉴权结果,则第4个参数传入null。
TELicenseCheck.getInstance().setTELicense(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 {
//鉴权失败
}
}
});
注意:
正常情况下,只要 App 能正常联网,且用户所在地区能正常访问 License URL,就能通过上述代码完成鉴权流程,并将 License 信息缓存在本地,因此您不需要把 License 文件内置到工程里。
但特殊情况下,APP 可能一直联网失败,或无法访问 License URL,此时就无法完成鉴权。为应对这种情况,您可以在浏览器内打开您的LicenseURL,把 License 文件下载下来放到工程的 src/main/assets 目录并命名为 v_cube.license,这样联网鉴权失败的情况下,也能实现本地鉴权。
如果采用了内置 license 的方案,请确保放在包里的 license 文件始终是最新的,例如 license 续期后,请重新下载 license 文件放在包里。
鉴权 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)


// 可用的入参属性可以从 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 的原工程