腾讯特效 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 | 描述 |
构造函数。 | |
SDK 渲染数据的方法,用于处理图片或视频流。 | |
设置美颜、美型、滤镜、美妆、贴纸、分割等效果,可在任意线程调用。 | |
设置 SDK 的 log 等级,默认为 Log.WARN 。开发调试阶段如有需要,可以将其设为Log.DEBUG。 正式发布时务必设置为Log.WARN 或Log.ERROR ,否则大量的日志会影响性能。在 new XmagicApi() 之后调用。 | |
调用此方法开启高性能模式。高性能模式开启后,美颜占用的系统 CPU/GPU 资源更少,可减少手机的发热和卡顿现象,更适合低端机长时间使用。 在 new XmagicApi() 之后调用。 | |
开启或关闭某个能力。 | |
设置输入数据类型,有相机数据和图片数据两类,默认是相机数据流。 | |
设置人脸、手势、身体检测状态回调。 | |
动效素材使用时是否开启静音。参数:true 表示静音,false 表示非静音。 | |
暂停特效里的声音播放,可与 Activity onPause 生命周期绑定。 | |
恢复特效里的声音播放,可与 Activity onResume 生命周期绑定。 | |
销毁 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
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" |
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)//渲染bitmapBitmap 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.WARN
或Log.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 资源更少,可减少手机的发热和卡顿现象,更适合低端机长时间使用。但与常规模式相比,功能会少一些。
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_SKIN
和 SEGMENTATION_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);@Deprecatedvoid 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.javapublic 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;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);}@Overrideprotected void onResume() {super.onResume();mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onPause() {super.onPause();mSensorManager.unregisterListener(this);}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void run() {if (tipsType == 0) {mTipsContainer.setVisibility(View.GONE);mImageTipsIsShow = false;} else {tipsPAGView.post(new Runnable() {@Overridepublic 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 |
动效
属性字段 | 说明 |
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 |
分割
属性字段 | 说明 |
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 接口开启高性能模式。