Android

腾讯特效 SDK 核心接口类 XmagicApi.java,用于初始化 SDK、更新美颜数值、调用动效等功能。
各 API 整体调用流程如下:




XmagicApi 的静态属性和方法列表

API
描述
VERSION
通过XmagicApi.VERSION可获取SDK的版本号(V3.5.0新增)。
设置 so库的路径,如果so库是内置在apk包里的,则无需使用该接口。
将应用程序 assets 下 Light3DPlugin、LightCore、LightHandPlugin、LightBodyPlugin、LightSegmentPlugin 文件夹中的内容复制到指定目录中。
将客户下载好的 AI 模型文件复制到对应的文件夹下。
获取设备等级。

XmagicApi 的 Public 方法列表

API
描述
XmagicApi
构造函数。
process
SDK 渲染数据的方法,用于处理图片或视频流。
setEffect
设置美颜、美型、滤镜、美妆、贴纸、分割等效果,可在任意线程调用。
设置 SDK 的 log 等级,默认为Log.WARN。开发调试阶段如有需要,可以将其设为Log.DEBUG。正式发布时务必设置为Log.WARNLog.ERROR,否则大量的日志会影响性能。
在 new XmagicApi() 之后调用。
调用此方法开启高性能模式。高性能模式开启后,美颜占用的系统 CPU/GPU 资源更少,可减少手机的发热和卡顿现象,更适合低端机长时间使用。
在 new XmagicApi() 之后调用。
开启或关闭某个能力。
设置输入数据类型,有相机数据和图片数据两类,默认是相机数据流。
设置人脸、手势、身体检测状态回调。
动效素材使用时是否开启静音。参数:true 表示静音,false 表示非静音。
onPause
暂停特效里的声音播放,可与 Activity onPause 生命周期绑定。
onResume
恢复特效里的声音播放,可与 Activity onResume 生命周期绑定。
onDestroy
销毁 xmagic,需要在 GL 线程中调用。
设置图像方向,使 AI 对不同朝向的人脸都能识别到,如果设置,则忽略 sensorChanged 传入的方向。
利用系统传感器判断当前手机旋转的角度,使 AI 对不同朝向的人脸都能识别到。
将一个动效素材的路径传给SDK,检测当前设备是否完全支持这个动效。
判断当前机型是否支持美颜(OpenGL3.0)。
获取当前纹理上的画面
设置动效提示语回调函数,用于将提示语展示到前端页面上。
updateProperty
updateProperties
setYTDataListener
onPauseAudio
getDeviceAbilities
getPropertyRequiredAbilities
isBeautyAuthorized
enableEnhancedMode
setDowngradePerformance
已废弃接口,不建议使用。详情请点击 这里

静态方法 setLibPathAndLoad

设置 so库的路径,并触发加载。
如果so库是内置在apk包里的,则无需使用该接口。如果 so 是动态下载的,则需要在鉴权和 new XmagicApi() 之前调用。
传入 null :表示从默认路径加载 so,请确保 so 是内置在 APK 包里的。
传入非 null:如 data/data/包名/files/xmagic_libs,将从这个目录去加载 so。
static boolean setLibPathAndLoad(String path)

静态方法 addAiModeFilesFromAssets

SDK的模型资源文件,可以内置在apk包的assets目录,也可以动态下载。如果是内置在assets里的,那么首次使用SDK之前,需要将 assets 下的模型资源文件复制到指定目录中。这个操作只需要做一次。在您升级SDK版本之后,才需要再执行一次。
context 应用上下文。
resDir 用于存放SDK模型资源的根目录,此目录和创建 new XmagicApi() 对象时传入的路径参数一致。
返回值:
0:复制成功
-1:表示 context 为 null
-2:表示 IO 错误
static int addAiModeFilesFromAssets(Context context, String resDir)

静态方法 addAiModeFiles

如果您未将SDK的模型资源文件内置在APK包里,而是动态下载,那么下载成功并解压后,可以调用此方法将下载好的SDK模型资源文件复制到对应的文件夹下。
inputResDir 下载成功的模型文件的文件夹。
resDir 用于存放SDK模型资源的根目录,此目录和创建 new XmagicApi() 对象时传入的路径参数一致。
返回值:
0:表示成功
-1:inputResDir is not exists
-2:表示 IO 错误
static int addAiModeFiles(String inputResDir, String resDir)

静态方法 getDeviceLevel

获取设备等级,V3.7.0新增。您可以根据设备等级开启或关闭SDK的相关功能,或在低等级手机上设置高性能模式
static DeviceLevel getDevicLevel(Context context)

public enum DeviceLevel { DEVICE_LEVEL_VERY_LOW(1), DEVICE_LEVEL_LOW(2), DEVICE_LEVEL_MIDDLE(3), DEVICE_LEVEL_MIDDLE_HIGH(4), DEVICE_LEVEL_HIGH(5); private final int value; DeviceLevel(int value) { this.value = value; } public int getValue() { return value; } }

XmagicApi 构造方法

XmagicApi(Context context, String resDir)

XmagicApi(Context context, String resDir,OnXmagicPropertyErrorListener xmagicPropertyErrorListener)

public interface OnXmagicPropertyErrorListener { void onXmagicPropertyError(String errorMsg, int code); }
参数
类型
含义
context
Context
上下文。
resDir
String
SDK模型资源文件目录。

在使用SDK之前,需要先确定一个目录用于存放SDK的模型资源文件,建议使用app私有目录:
resDir = context.getFilesDir().getAbsolutePath() + "/xmagic"

并且在new XmagicApi 之前,请先调用 XmagicApi的静态方法addAiModeFilesFromAssetsaddAiModeFiles将模型资源文件copy到resDir。
xmagicPropertyErrorListener
OnXmagicPropertyErrorListener
错误回调接口。在使用SDK过程中,此接口会回调内部的一些错误信息。一般在开发调试时使用。
OnXmagicPropertyErrorListener 返回错误码含义对照表:
错误码
含义
-1
未知错误。
-100
3D 引擎资源初始化失败。
-200
不支持 GAN 素材。
-300
设备不支持此素材组件。
-400
模板 JSON 内容为空。
-500
SDK 版本过低。
-600
不支持分割。
-700
不支持 OpenGL。
-800
不支持脚本。
5000
分割背景图片分辨率超过 2160×3840。
5001
分割背景图片所需内存不足。
5002
分割背景视频解析失败。
5003
分割背景视频超过200秒。
5004
分割背景视频格式不支持。
5005
分割背景图片存在旋转角度

process

SDK 渲染数据的方法,用于处理图片或视频流。处理视频流时,可在相机数据回调函数内使用。
//渲染纹理
int process(int srcTextureId, int srcTextureWidth, int srcTextureHeight)
//渲染bitmap
Bitmap process(Bitmap bitmap, boolean needReset)
参数
含义
int srcTextureId
需要被渲染的纹理。类型为:OpenGL 2D 纹理格式,像素格式为 RGBA。
int srcTextureWidth
需要被渲染的纹理宽。
int srcTextureHeight
需要被渲染的纹理高。
Bitmap bitmap
建议最大尺寸 2160×4096。超过这个尺寸的图片人脸识别效果不佳或无法识别到人脸,同时容易引起 OOM 问题,建议把大图缩小后再传入。
boolean needReset
以下几种场景请将needReset设置为true
首次process一张图片,或切换图片。
首次使用分割。
首次使用动效。
首次使用美妆。

setEffect

设置美颜、美型、滤镜、美妆、贴纸、分割等效果,可在任意线程调用。具体参数请参见 美颜参数说明
void setEffect(String effectName, int effectValue, String resourcePath, Map<String, String> extraInfo)

setXmagicLogLevel

在 new XmagicApi() 之后调用。设置 SDK 的 log 等级,默认为Log.WARN。开发调试阶段如有需要,可以将其设为Log.DEBUG。正式发布时务必设置为Log.WARNLog.ERROR,否则大量的日志会影响性能。
如果设置了 ITELogger,则会把SDK内部的日志回调给使用者。
public void setXmagicLogLevel(int level);
public void setXmagicLogLevel(int level, final ITELogger logger);

public interface ITELogger{ void log(int severity, String tag, String msg); void log(int severity, String tag, String msg, Throwable throwable); }

enableHighPerformance

调用此方法开启高性能模式,V3.7.0新增。高性能模式开启后,美颜占用的系统 CPU/GPU 资源更少,可减少手机的发热和卡顿现象,更适合低端机长时间使用。但与常规模式相比,功能会少一些。
需要在 new XmagicApi() 之后立即调用。详细说明见高性能模式使用指引
void enableHighPerformance()

setFeatureEnableDisable

开启或关闭某个能力,请按需使用。
void setFeatureEnableDisable(String featureName, boolean enable)
参数
含义
String featureName
原子能力名称
取值如下:
XmagicConstant.FeatureName.SEGMENTATION_SKIN 皮肤分割能力,开启后可使磨皮和美白区域更精准。
XmagicConstant.FeatureName.SEGMENTATION_FACE_BLOCK人脸遮挡检测能力,开启后可避免妆容画到遮挡物上。
XmagicConstant.FeatureName.WHITEN_ONLY_SKIN_AREA 美白仅对皮肤生效
XmagicConstant.FeatureName.SMART_BEAUTY 智能美颜(为男性、宝宝减淡美颜美妆效果)
XmagicConstant.FeatureName.ANIMOJI_52_EXPRESSION 人脸表情能力
XmagicConstant.FeatureName.BODY_3D_POINT 身体点位能力
XmagicConstant.FeatureName.HAND_DETECT 手势检测能力
boolean enable
true 表示开启此能力,false 表示关闭此能力
上述能力中,比较常用的是 SEGMENTATION_SKINSEGMENTATION_FACE_BLOCK,SDK会根据getDeviceLevel的值默认开启这两项能力。如果您需要手动开启,建议在 level >=4 时,开启 SEGMENTATION_SKIN, 在 level >= 5时,开启 SEGMENTATION_FACE_BLOCK

setXmagicStreamType

设置输入数据类型,有相机数据和图片数据两类,默认是相机数据流。
void setXmagicStreamType(int type)
参数
含义
int type
数据源类型,有以下两种选择:
XmagicApi.PROCESS_TYPE_CAMERA_STREAM :相机数据源。
XmagicApi.PROCESS_TYPE_PICTURE_DATA:图片数据源。

setAIDataListener

public void setAIDataListener(final XmagicAIDataListener aiDataListener);

public interface OnAIDataListener {
void onFaceDataUpdated(List<TEFaceData> faceDataList);
void onBodyDataUpdated(List<TEBodyData> bodyDataList);
void onAIDataUpdated(String jsonString);
@Deprecated
void onHandDataUpdated(List<TEHandData> handDataList);
}

onFaceDataUpdated

SDK开始process图像后就会有回调,识别到人脸时,回调 List<FaceData>,list的size就是人脸个数。没有人脸时,回调一个空的 List。
TEFaceData的定义如下,points是人脸83点的坐标,每个点有x、y两个坐标值,因此points长度固定为166。每个点的坐标值的取值范围不是基于原始输入图,而是将原图的短边缩放到256之后得到的人脸坐标。
因此,这里的回调的数据,建议仅用于判断当面画面中是否有人脸、有几个人脸。如果需要更高精度的人脸点位,请使用 onAIDataUpdated 回调的数据。
public class TEFaceData { public float[] points; public TEFaceData() { } public TEFaceData(float[] points) { this.points = points; } }

onHandDataUpdated

已废弃接口,不会有数据回调。老版本SDK在设置了手势动效,且识别到手势时回调。
如果需要手势数据,请使用 onAIDataUpdated 回调的数据。

onBodyDataUpdated

设置了美体的属性并且识别到身体的时候回调,其他情况不回调。回调的是身体42点的坐标,坐标值基于输入图的宽高。如果某个点未检测到,则坐标值为0。





onAIDataUpdated

回调人脸、手势、身体3D的详细数据,通常需要使用特定的Licence才有数据。一份示例数据如下:
关于face_info的详细说明,请查看人脸点位
关于hand_info的详细说明,请查看手势识别
关于body_3d_info的详细说明,请查看 身体点位Android身体点位iOS
{
"face_info": [{
"expression_weights": [0.001172, 0, 0.029249, ... , 0.060041, 0],
"face_256_point": [211.844238, 673.247192, ... , 339.247925, 654.792603],
"face_256_visible": [0.163925, 0.14921, ... , 0.99887, 0.99887],
"face_3d_info": {
"pitch": -3.860844850540161,
"pitch_fixed": 2.1123428344726562,
"roll": -12.797032356262207,
"roll_fixed": 1.3187808990478516,
"transform": [
[0.8919625878334045, 0.2843534052371979, 0.3514907658100128, 0],
[-0.17628398537635803, 0.9346542954444885, -0.3087802827358246, 0],
[-0.41632509231567383, 0.21345829963684082, 0.88380366563797, 0],
[-0.020958196371793747, -0.04502145200967789, -0.6078543663024902, 1]
],
"yaw": 24.824481964111328,
"yaw_fixed": 25.02082061767578
},
"left_eye_high_vis_ratio": 0,
"left_eyebrow_high_vis_ratio": 0,
"mouth_high_vis_ratio": 1,
"out_of_screen": false,
"right_eye_high_vis_ratio": 1,
"right_eyebrow_high_vis_ratio": 0.821429,
"trace_id": 21
}],
"hand_info": {
"gesture": "PAPER",
"hand_point_2d": [180.71888732910156, 569.2958984375, ... , 353.8714294433594, 836.246826171875]
},
"body_3d_info": {
"imageHeight": 652,
"imageWidth": 320,
"items": [{
"index": 1,
"pose": [0.049122653901576996, ... , 0],
"position_x": [190.47494506835938, 235.23098754882812, ... , 4.948424339294434, 173.59298706054688],
"position_y": [777.2109375, 836.488037109375, ... , 161.19752502441406, 405.83905029296875],
"position_z": [0, 0, ... , 0, 0],
"rotation": [{
"data": [0.9944382905960083, -0.09695644676685333, -0.0411277711391449, 0.000708006089553237]
},
......
{
"data": [0.9907779693603516, 0.13549542427062988, 0, 0]
}, {
"data": [1, 0, 0, 0]
}]
}]
}
}

setAudioMute

动效素材使用时是否开启静音(V2.5.0新增):
参数:true 表示静音,false 表示非静音。

onPause

暂停特效里的声音播放,可与 Activity onPause 生命周期绑定。
void onPause()

onResume

恢复特效里的声音播放,可与 Activity onResume 生命周期绑定。
void onResume()

onDestroy

清理GL线程资源,需要在 GL 线程内调用。示例代码:
//示例代码见 TECameraBaseActivity.java
public void onGLContextDestroy() { if (this.mXMagicApi != null) { this.mXMagicApi.onDestroy(); this.mXMagicApi = null; } }

setImageOrientation

void setImageOrientation(TEImageOrientation orientation)

public enum TEImageOrientation { ROTATION_0, ROTATION_90, ROTATION_180, ROTATION_270 }
设置图像方向,使 AI 对不同朝向的人脸都能识别到,如果设置,则忽略 sensorChanged 传入的方向。方向示例如下:



如果您传给SDK的图像人物始终是正的(Rotation = 0),则无需调用此接口。

sensorChanged

void sensorChanged(android.hardware.SensorEvent event, android.hardware.Sensor accelerometer)
利用系统传感器判断当前手机旋转的角度,使 AI 对不同朝向的人脸都能识别到。注意:如果通过 setImageOrientation 设置了固定的方向,则会忽略 sensorChagned 传入的方向。
用法示例:
public class MyActivity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mAccelerometer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}

@Override
public void onSensorChanged(SensorEvent event) {
if (mXMagicApi != null) {
mXMagicApi.sensorChanged(event, mAccelerometer);
}
}
}

isDeviceSupport

boolean isDeviceSupport(String motionResPath)
将一个动效素材的路径传给SDK,检测当前设备是否完全支持这个动效。
例如一个动效里有口红、面部贴纸、背景分割,如果当前设备不支持背景分割,则此接口会返回false。false并不意味着该动效完全无法使用,而是部分效果无法呈现出来。

isSupportBeauty

判断当前机型是否支持美颜(OpenGL3.0),目前市场上绝大多数手机都是支持OpenGL3.0的,所以通常无需使用此接口。
boolean isSupportBeauty()

exportCurrentTexture

获取当前纹理上的画面
void exportCurrentTexture(ExportTextureCallback callback)

public interface ExportTextureCallback { void onCallback(Bitmap bitmap); }

setTipsListener

设置动效提示语回调函数,用于将提示语展示到前端页面上。例如某些素材会提示用户点点头、伸出手掌、比心等。
注意:回调方法不一定在主线程
void setTipsListener(XmagicApi.XmagicTipsListener effectTipsListener)
XmagicTipsListener 包含如下方法:
public interface XmagicTipsListener { /** * 显示tips。 * @param tips 返回的提示语文本信息。 * @param tipsIcon tips的icon的文件路径,可根据文件路径解析出对应图片,pag文件的话需要使用pagView来展示。
* 注意:tipsIcon有可能为空,素材中没有配置就返回空值 * @param type tips类别,0表示tips和tipsIcon 都有值,1表示是pag素材只有tipsIcon有值。 * @param duration tips显示时长, 毫秒 */ void tipsNeedShow(String tips, String tipsIcon, int type, int duration); /*** * 隐藏tips。 * @param tips 返回的提示语文本信息。 * @param tipsIcon tips的icon的文件路径,可根据文件路径解析出对应图片,pag文件的话需要使用pagView来展示。
* 注意:tipsIcon有可能为空,素材中没有配置就返回空值 * @param type tips类别,0表示tips和tipsIcon 都有值,1表示是pag素材只有tipsIcon有值。 */ void tipsNeedHide(String tips, String tipsIcon, int type); }
示例代码如下:
public void tipsNeedShow(final String tips, String tipsIcon, int type, int duration) {
final int tipsType = type;
final String tipsIconPath = tipsIcon;
mMainThreadHandler.post(new Runnable() {
@Override
public void run() {
if (tipsType == 0) {
if (!TextUtils.isEmpty(tipsIconPath) && !mImageTipsIsShow) {
mTipsImageView.setVisibility(View.VISIBLE);
Bitmap bitmap = BitmapUtils.decodeSampleBitmap(AEModule.getContext(), tipsIconPath, Integer.MAX_VALUE, Integer.MAX_VALUE);
mTipsImageView.setImageBitmap(bitmap);
mImageTipsIsShow = true;
} else {
mTipsImageView.setVisibility(View.GONE);
}
mTipsTextView.setText(tips);
} else {
pagFile = PAGFile.Load(tipsIconPath);
tipsPAGView.post(new Runnable() {@
Override
public void run() {
if (pagFile != null) {
tipsPAGView.setRepeatCount(-1);
tipsPAGView.setComposition(pagFile);
tipsPAGView.setProgress(0);
tipsPAGView.play();
tipsPAGView.setVisibility(View.VISIBLE);
}
}
});
}
}
});
}
public void tipsNeedHide(String tips, String tipsIcon, int type) {
final int tipsType = type;
final String tipsIconPath = tipsIcon;
mMainThreadHandler.post(new Runnable() {
@Override
public void run() {
if (tipsType == 0) {
mTipsContainer.setVisibility(View.GONE);
mImageTipsIsShow = false;
} else {
tipsPAGView.post(new Runnable() {
@Override
public void run() {
tipsPAGView.stop();
tipsPAGView.setVisibility(View.GONE);
}
});
}
}
});
}

已废弃接口汇总

updateProperty,updateProperties

已废弃,请使用 setEffect 接口。
更改某一项或批量更改多项美颜、动效、滤镜,可在任意线程调用。
void updateProperty(XmagicProperty<?> p)
void updateProperties(List<XmagicProperty<?>> properties)
参数
含义
XmagicProperty<?> p
腾讯特效数据实体类。
以"磨皮"为例,可以按如下方式 new 一个实例:new XmagicProperty<>(Category.BEAUTY, null, null, BeautyConstant.BEAUTY_SMOOTH, new XmagicPropertyValues(0, 100, 50, 0, 1));
以“2D 动效兔兔酱”为例,可以按如下方式 new 一个实例:new XmagicProperty<>(Category.MOTION, "video_tutujiang" , "动效的文件路径", null, null);

如果想要某个动效/美妆/分割素材叠加在当前素材上,则将该素材 XmagicProperty 对象的 mergeWithCurrentMotion 设置为 true。关于素材叠加的详细说明见 素材叠加

更多的例子,请参考 Demo 工程 assets/beauty_panel 文件夹下的配置信息。

XmagicProperty

已废弃。请使用 setEffect 接口设置美颜特效。
美颜
属性字段
说明
category
Category.BEAUTY
ID
null
特殊情况:
瘦脸中的(自然、女神、英俊) ID 值分别为:BeautyConstant.BEAUTY_FACE_NATURE_ID、 BeautyConstant.BEAUTY_FACE_FEMALE_GOD_ID、BeautyConstant.BEAUTY_FACE_MALE_GOD_ID
口红中的 ID 值为:XmagicConstant.BeautyConstant.BEAUTY_LIPS_LIPS_MASK
腮红中的 ID 值为:XmagicConstant.BeautyConstant.BEAUTY_MAKEUP_MULTIPLY_MULTIPLY_MASK
立体中的 ID 值为:XmagicConstant.BeautyConstant.BEAUTY_SOFTLIGHT_SOFTLIGHT_MASK
resPath
null
特殊情况:口红、腮红、立体的 resPath 是资源图片的路径,具体请参考 Demo 中 assets/beauty_panel/advanced_beauty.json 文件。
effkey
必填,参见 Demo
示例:美白 BeautyConstant.BEAUTY_WHITEN
effValue
必填,参见 Demo 中 assets/beauty_panel/advanced_beauty.json 文件,demo 工程中解析该文件构造一个XmagicPropertyValues对象,XmagicPropertyValues各个属性取值见 美颜参数说明
美体
属性字段
说明
category
Category.BODY_BEAUTY
ID
null
resPath
null
effkey
必填,参见 Demo
示例:长腿 BeautyConstant.BODY_LEG_STRETCH
effValue
必填,参见 Demo 中 assets/beauty_panel/beauty_body.json 文件。demo工程中解析该文件构造一个XmagicPropertyValues对象,XmagicPropertyValues各个属性取值见 美颜参数说明
滤镜
属性字段
说明
category
Category.LUT
ID
图片名称,必填
示例:dongjing_lf.png
“无” ID 为 XmagicProperty.ID_NONE
resPath
滤镜图片路径,必填,“无”设置为 null
effkey
null
effValue
必填,“无”设置为 null。是一个 XmagicPropertyValues 对象,XmagicPropertyValues 各个属性取值见 美颜参数说明
动效
属性字段
说明
category
Category.MOTION
ID
资源文件夹名称,必填
示例:video_lianliancaomei
“无” ID 为 XmagicProperty.ID_NONE
resPath
必填,参见 Demo
effkey
null
effValue
null
美妆
属性字段
说明
category
Category.MAKEUP
ID
资源文件夹名称,必填
示例:video_xuejiezhuang
“无” ID 为 XmagicProperty.ID_NONE
resPath
必填,参见 Demo
effkey
必填,取值为:makeup.strength“无”设置为 null
effValue
必填,“无”设置为 null。是一个 XmagicPropertyValues 对象,XmagicPropertyValues 各个属性取值见 美颜参数说明
分割
属性字段
说明
category
Category.SEGMENTATION
ID
资源文件夹名称,必填
示例:video_segmentation_blur_45
“无” ID 为 XmagicProperty.ID_NONE
自定义分割 ID 值必须使用:XmagicConstant.SegmentationId.CUSTOM_SEG_ID
resPath
必填,参见 Demo
effkey
null(自定义背景除外),自定义背景的值为选择的资源路径
effValue
null

setYTDataListener

已废弃接口,请使用 setAIDataListener 的 onAIDataUpdated回调。

onPauseAudio

当仅需要停止音频,但不需要释放 GL 线程时调用此函数。

getPropertyRequiredAbilities

传入一个动效资源列表,返回每一个资源所使用到的 SDK 原子能力列表。 方法的使用场景为: 您购买或制作了若干款动效素材,调用这个方法,会返回每一个素材需要使用的原子能力列表。例如素材1需要使用能力 A、B、C,素材2需要使用能力 B、C、D,然后您把这样的能力列表保持在服务器上。之后,当用户要从服务器下载动效素材时,用户先通过 getDeviceAbilities 方法获取他手机具备的原子能力列表(例如这台手机具备能力 A、B、C,但不具备能力 D),把他的能力列表传给服务器,服务器判断该设备不具备能力 D,因此不给该用户下发素材2。
参数
含义
List<XmagicProperty<?>> assets
需要检测原子能力的动效资源列表。
返回值 Map<XmagicProperty<?>,ArrayList<String>>
key:动效资源素材实体类。
value:所使用到的原子能力列表。

getDeviceAbilities

返回当前设备支持的原子能力表。与 getPropertyRequiredAbilities 方法搭配使用,详见 getPropertyRequiredAbilities 的说明。
Map<String,Boolean> getDeviceAbilities()
返回值 Map<String,Boolean>
key:原子能力名(与素材能力名字对应)。
value:当前设备是否支持。

isBeautyAuthorized

判断当前的 License 授权支持哪些美颜或美体项。 仅支持 BEAUTY 和 BODY_BEAUTY 类型的美颜项检测。检测后的结果会赋值到各个美颜对象 XmagicProperty.isAuth 字段中。如果 isAuth 字段为 false,可以在 UI 上屏蔽这些项的入口。
void isBeautyAuthorized(List<XmagicProperty<?>> properties)

enableEnhancedMode

开启美颜增强模式。默认未开启。具体请参考增强模式使用指南

setDowngradePerformance

请使用 enableHightPerformance 接口开启高性能模式。