集成方式
下载 SDK
集成
添加下载的 xmagic-xxxx
.aar
文件到 app 工程 libs
目录下。将 SDK 包内的 assets/ 目录下的全部资源拷贝到
../src/main/assets
目录下,如果 SDK 包中的 MotionRes 文件夹内有资源,将此文件夹也拷贝到 ../src/main/assets
目录下 。将 jniLibs 文件夹拷贝到工程的
../src/main/jniLibs
目录下。导入方法
打开 app 模块的
build.gradle
添加依赖引用:android{...defaultConfig {applicationId "修改成与授权lic绑定的包名"....}packagingOptions {pickFirst '**/libc++_shared.so'}}?dependencies{...compile 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'}?
动态下载 assets、so、动效资源指引
为了减少包大小,您可以将 SDK 所需的 assets 资源、so 库、以及动效资源 MotionRes(部分基础版 SDK 无动效资源)改为联网下载。在下载成功后,将上述文件的路径设置给 SDK。
腾讯特效 SDK 已经发布到 mavenCentral 库,您可以通过配置 gradle 自动下载更新。
1. 在 dependencies 中添加腾讯特效 SDK 的依赖。
dependencies {//例如:S1-04套餐如下:implementation 'com.tencent.mediacloud:TencentEffect_S1-04:版本号'//“版本号”可以在官网的“版本历史”页面看到,例如 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. 单击
?
Sync Now,自动下载 SDK 并集成到工程里。4. 如果您的套餐包含动效和滤镜功能,那么需要在 SDK 下载页面 下载对应的套餐包,将包内免费的动效和滤镜素材放置在您工程下的如下目录:
动效:
../assets/MotionRes
滤镜:
../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 指引。
注意
正常情况下,只要 App 成功联网一次,就能完成鉴权流程,因此您不需要把 License 文件内置到工程里。但作为兜底方案,您也可以在浏览器内打开您的LicenseURL,把 License 文件下载下来放到 assets 目录并命名为v_cube.license,这样即使 APP 从未联网,或首次联网失败,也能完成鉴权流程。
2. 在相关业务模块的初始化代码中设置 URL 和 KEY,触发 License 下载,避免在使用前才临时去下载。也可以在 Application 的 onCreate 方法里触发下载,但不建议,因为此时可能没有网络权限或联网失败率较高。
//如果仅仅是为了触发下载或更新license,而不关心鉴权结果,则第4个参数传入null。TELicenseCheck.getInstance().setTELicense(context, URL, KEY, null);
3. 然后在真正要使用美颜功能前( 例如 Demo 的 TEMenuActivity
.java
),再去做鉴权:// 如果您的so库是从网络下载的,那么请在调用TELicenseCheck.getInstance().setTELicense之前,先设置so的路径,否则鉴权会失败。// XmagicApi.setLibPathAndLoad(validLibsDirectory);// 如果您的so内置在apk包内,则无需调用上面的方法。TELicenseCheck.getInstance().setTELicense(context, URL, KEY, new TELicenseCheckListener() {?@Overridepublic 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 | 授权文件已过期,需要向腾讯云申请续期 |
其他 | 请联系腾讯云团队处理 |
步骤二:资源拷贝
1. 如果您的资源文件是内置在 assets 目录的,那么使用前需要 copy 到 app 的私有目录。您可以提前 copy 好,或者在上一步鉴权成功的回调里执行拷贝操作。示例代码在 Demo 的
TEMenuActivity.java
。//将resPath设置给下边copyRes方法的mResPath变量String resPath = new File(getFilesDir(), AppConfig.getInstance().getBeautyFileDirName()).getAbsolutePath();??//copy资源文件到私有目录,只需要做一次//需要在子线程调用public static boolean copyRes(Context context) { if (TextUtils.isEmpty(mResPath)) { throw new IllegalStateException("resource path not set, call XmagicResParser.setResPath() first."); } int addResult = XmagicApi.addAiModeFilesFromAssets(context, mResPath); LogUtils.e(TAG, "add ai model files result = " + addResult); String lutDirName = "lut"; boolean result = FileUtil.copyAssets(context, lutDirName, mResPath + "light_material" + File.separator + lutDirName); String motionResDirName = "MotionRes"; boolean result2 = FileUtil.copyAssets(context, motionResDirName, mResPath + motionResDirName); return result && result2; }
2. 如果您的资源文件是从 网络动态下载 的,下载成功后,需要设置资源文件路径。示例代码在 Demo 的 TEMenuActivity
.java
。mXmagicApi = new XmagicApi(this, 下载的资源文件本地路径,new XmagicApi.OnXmagicPropertyErrorListener());
步骤三:SDK 初始化及使用方法
使用腾讯特效 SDK 生命周期大致如下:
1. 构造美颜 UI 数据,可参考 Demo 工程中tebeautykit模块(com.tencent.effect.beautykit.provider包下代码)。
2. 预览布局中添加 Demo 中的 GLCameraXView。
<com.tencent.demo.camera.camerax.GLCameraXViewandroid: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" />
3. (可选)快速实现相机。
将 Demo 工程中的 com.tencent.demo.camera 目录拷贝到工程中。利用 GLCameraXView 类快速实现相机功能。详细实现可参考 Demo 工程的 TECameraActivity
.java
。@Overridepublic int onCustomProcessTexture(int textureId, int textureWidth, int textureHeight) {int resultTextureId = 0;if (!isUseTencentEffect) {resultTextureId = textureId;} else {resultTextureId = mXmagicApi.process(textureId, textureWidth, textureHeight);}return resultTextureId;}
4. 初始化美颜 SDK,建议放在 Activity 的
onResume()
方法中。//resPath是步骤二中第一步设置的路径mXmagicApi = new XmagicApi(this, resPath,new XmagicApi.OnXmagicPropertyErrorListener());
参数
参数 | 含义 |
Context context | 上下文 |
String resDir | 资源文件目录,详见请参见 步骤二 |
OnXmagicPropertyErrorListener errorListener | 回调函数实现类 |
5. 添加素材提示语回调函数(方法回调有可能运行在子线程),部分素材会提示用户:点点头、伸出手掌、比心,这个回调就是用于展示类似的提示语。
mXmagicApi.setTipsListener(new XmagicTipsListener() {final XmagicToast mToast = new XmagicToast();@Overridepublic void tipsNeedShow(String tips, String tipsIcon, int type, int duration) {mToast.show(MainActivity.this, tips, duration);}?@Overridepublic void tipsNeedHide(String tips, String tipsIcon, int type) {mToast.dismiss();}});
6. 美颜 SDK 处理每帧数据并返回相应处理结果。process 方法详细说明见 API 文档。
int outTexture = mXmagicApi.process(textureId, textureWidth, textureHeight);
7. 更新指定类型的美颜特效数值。
//3.5.0版本及之后使用此方法mXmagicApi.setEffect(String effectName, int effectValue, String resourcePath, Map<String, String> extraInfo)??// 可用的入参属性可以从 XmagicResParser.parseRes() 获得// 3.3.0版本及之前使用此方法mXmagicApi.updateProperty(XmagicProperty<?> p);?
8. 恢复音频效果,建议在
Activity
的 onResume()
方法中调用。//恢复美颜中的声音效果,部分素材包含音频效果mXmagicApi.onResume();
9. 暂停音频效果,建议在 Activity 的
onPause()
方法调用。//暂停素材声音,不分素材包含音频效果mXmagicApi.onPause();
10. 释放美颜 SDK,需要在GL线程中调用。
//注意,此方法需要在GL线程中调用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 的原工程 |
?