功能说明

本文为您介绍Android端美颜特效SDK的简单使用示例。

说明
  • 如果您是从V1.*.*版本升级到V2.0.0及更高版本时,需注意以下内容。

    • Java API的包名由com.taobao.android.libqueen变更为com.aliyun.android.libqueen

    • 若您计划将美颜特效SDK版本由V1.*.*更新至V2.0.0及其之后版本,您需要重新发送申请到创建应用并绑定License申请补发LicenseKey和LicenseFile(证书文件),并在标题中注明申请补发,我们会在收到申请后工作日48小时内,补发一体化LicenseKey和LicenseFile(证书文件)。若您计划新建应用并申请美颜特效SDK授权,请您登录视频直播、视频点播控制台>SDK管理>我的授权进行操作。

  • 集成完整流程,请参见参考资料内Demo示例。

  • 接入常见问题说明,请参见美颜特效SDK通用问题

基础美颜接入

  1. 创建QueenEngine实例,设置初始化纹理与视窗参数

    QueenEngine engine;
    try {
        com.aliyun.android.libqueen.QueenConfig config = new com.aliyun.android.libqueen.QueenConfig();
        // true表示直接输出到当前OpenGL的显示区域,默认为false
        config.toScreen = false;
        // true表示打开调试日志开关,默认为false,建议只在Debug包打开日志调试,避免影响性能
        config.enableDebugLog = false;
        // true表示需要Queen创建gl上下文,默认为false
        config.withContext = false;
        // true表示需要创建单独的线程,默认为false
        config.withNewGlThread = false;
        if (withContext || withNewGlThread) {
            // 如果需要Queen在单独的线程创建gl上下文,且需要共享当前线程的gl上下文,那么配置当前gl上下文
            if (Build.VERSION.SDK_INT >= 21) {
              config.shareGlContext = EGL14.eglGetCurrentContext().getNativeHandle();
            } else {
              config.shareGlContext = EGL14.eglGetCurrentContext().getHandle();
            }
        }
        // 传入Android.content.Context触发引擎的初始化
        // 第二个参数为创建实例的配置
        engine = new QueenEngine(mContext, config);
    } catch (InitializationException e) {
        e.printStackTrace();
    }
    
    // 设置输入纹理,用于美颜流程的渲染
    // 第四个参数表示输入纹理是否为OES类型的纹理
    engine.setInputTexture(textureId, textureWidth, textureHeight, true);
    
    // 非必要步骤:获得美颜输出纹理,可以在用于其他扩展业务,如果需要按照输入纹理方向返回输出纹理,则在生成纹理和设置纹理的时候,将“保持纹理方向”参数设置为true
    Texture2D outTexture = engine.autoGenOutTexture(true);
    
    // 设置视窗大小
    engine.setScreenViewport(0, 0, viewWidth, viewHeight);
    // 开启log日志打印调试模式,建议只在Debug包打开日志调试,避免影响性能
    engine.enableDebugLog();
  2. 设置基础美颜效果

    // 美白开关
    engine.enableBeautyType(BeautyFilterType.kSkinWhiting, true);
    // 美白参数 [0,1]
    engine.setBeautyParam(
        BeautyParams.kBPSkinWhitening, 
        0.3f
    );
    /**
    * 磨皮和锐化开关,
    * 第三个参数为基础美颜的模式,设置为kBMSkinBuffing_Natural,则美颜的效果更自然,细节保留更多;设置为kBMSkinBuffing_Strong,则效果更夸张,细节去除更多。
    */
    engine.enableBeautyType(BeautyFilterType.kSkinBuffing, true, BeautyFilterMode.kBMSkinBuffing_Natural);
    // 磨皮 [0,1]
    engine.setBeautyParam(BeautyParams.kBPSkinBuffing, 0.6f);
    // 锐化 [0,1]
    engine.setBeautyParam(BeautyParams.kBPSkinSharpen, 0.2f);
  3. 渲染绘制

    // OES纹理的变换矩阵,通过SurfaceTexture获取
    // SurfaceTexture是渲染核心组件,提供输出到纹理的Surface
    float[] transformMatrix = new float[16];
    // 通过SurfaceTexture更新矩阵
    mSurfaceTexture.updateTexImage();
    mSurfaceTexture.getTransformMatrix(transformMatrix);
    
    // 渲染到当前窗口,如证书校验失败或者全部特效功能关闭,则SDK不会执行渲染操作
    int retCode = engine.renderTexture(transformMatrix);
    
    // 参考API文档
    // QUEEN_INVALID_LICENSE(-9),表示证书校验失败
    // QUEEN_NO_EFFECT(-10),表示全部特效功能关闭
    // 则需要业务方执行渲染,可参考Sample工程
    if (retCode == -9 || retCode == -10) {
        mFrameGlDrawer.draw(transformMatrix, mOESTextureId, true);
    }
  4. 销毁QueenEngine

    // 释放引擎资源
    engine.release();

高级功能

使用高级功能,如高级美颜、美型、美体、美妆、滤镜、贴纸,需要调用执行算法。

if (mUseTextureBuffer) { // 直接使用纹理数据执行算法
  engine.updateInputTextureBufferAndRunAlg(
      mCamera.inputAngle, mCamera.outAngle,
      mCamera.flipAxis, false);
} else {
  // 输入帧图片流
  engine.updateInputDataAndRunAlg(
    imageData, // 帧图片流
    ImageFormat.NV21, // 帧图片流格式
    imageWidth, // 帧图片宽度
    imageHeight, // 帧图片高度
    0, // 用于检测的图像的跨度(以像素为单位),即每行的字节数, 默认情况下设为 0
    mCamera.inputAngle, // 当前输入帧图片需旋转的角度,计算方式参考Sample工程
    mCamera.outAngle, // 算法输出结果所需旋转的角度,计算方式参考Sample工程
    mCamera.flipAxis // 输出数据的xy轴翻转处理,0为不旋转,1为x轴翻转,2为y轴翻转
  );
}

高级美颜

// 高级美颜开关
engine.enableBeautyType(BeautyFilterType.kFaceBuffing, true);
//  去除法令纹[0,1]
engine.setBeautyParam(BeautyParams.kBPNasolabialFolds, 0.3f); 
//祛眼袋[0,1]
engine.setBeautyParam(BeautyParams.kBPPouch, 0.3f); 
// 白牙[0,1]
engine.setBeautyParam(BeautyParams.kBPWhiteTeeth, 0.2f); 
// 滤镜美妆:口红[0,1]
engine.setBeautyParam(BeautyParams.kBPLipstick, 0.2f); 
// 滤镜美妆:腮红[0,1]
engine.setBeautyParam(BeautyParams.kBPBlush, 0.2f);
// 滤镜美妆:亮眼[0,1]
engine.setBeautyParam(BeautyParams.kBPBrightenEye, 1.0f);
// 滤镜美妆:红润[0,1]
engine.setBeautyParam(BeautyParams.kBPBlush, 1.0f);
// 滤镜美妆:口红色相[-0.5,0.5],需配合饱和度、明度使用,参考颜色如下:土红(-0.125)、粉红(-0.1)、复古红(0.0)、紫红(-0.2)、正红(-0.08)、橘红(0.0)、紫色(-0.42)、橘色(0.125)、黄色(0.25)
engine.setBeautyParam(BeautyParams.kBPLipstickColorParam, 0.0f);
// 滤镜美妆:口红饱和度[0,1],需配合色相、明度使用,参考颜色如下:土红(0.25)、粉红(0.125)、复古红(1.0)、紫红(0.35)、正红(1.0)、橘红(0.35)、紫色(0.35)、橘色(0.25)、黄色(0.45)
engine.setBeautyParam(BeautyParams.kBPLipstickGlossParam, 0.0f);
// 滤镜美妆:口红明度[0,1],需配合色相、饱和度使用,参考颜色如下:土红(0.4)、粉红(0.0)、复古红(0.2)、紫红(0.0)、正红(0.0)、橘红(0.0)、紫色(0.0)、橘色(0.0)、黄色(0.0)
engine.setBeautyParam(BeautyParams.kBPLipstickBrightnessParam, 1.0f);
// 祛皱[0,1]
engine.setBeautyParam(BeautyParams.kBPWrinkles, 0.2f);
// 去暗沉[0,1]
engine.setBeautyParam(BeautyParams.kBPBrightenFace, 0.2f);
//开启功能
engine.enableBeautyType(BeautyFilterType.kHSV,true);
//饱和度[-1,1]
engine.setBeautyParam(BeautyParams.kBPHSV_SATURATION,0.2f);
//对比度[-1,1]
engine.setBeautyParam(BeautyParams.kBPHSV_CONTRAST,0.2f);

人脸特效

//马赛克效果
engine.enableBeautyType(BeautyFilterType.kBTEffectMosaicing,true);
engine.setBeautyParam(BeautyParams.kBPEffects_Mosaicing,0.45f);

美型

/**
 * 美型开关,其中第二个参数是功能开关,第三个参数为调试开关
 * 第四个参数为美型的模式,可以设置为kBMFaceShape_Baseline、kBMFaceShape_Main、kBMFaceShape_High、kBMFaceShape_Max四种模式,形变的幅度会依次变强
 */
engine.enableBeautyType(BeautyFilterType.kFaceShape, true, false, BeautyFilterMode.kBMFaceShape_Main);
/**
 * 美型参数:颧骨
 * 参数范围:[0,1]
 */
engine.updateFaceShape(FaceShapeType.typeCutCheek, 0.0f);
/**
 * 美型参数:削脸
 * 参数范围:[0,1]
 */
engine.updateFaceShape(FaceShapeType.typeCutFace, 0.0f);
/**
 * 美型参数:瘦脸
 * 参数范围:[0,1]
 */
engine.updateFaceShape(FaceShapeType.typeThinFace, 0.0f);
/**
 * 美型参数:脸长
 * 参数范围:[0,1]
 */
engine.updateFaceShape(FaceShapeType.typeLongFace, 0.0f);
/**
 * 美型参数:下巴缩短
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeLowerJaw, 0.0f);
/**
 * 美型参数:下巴拉长
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeHigherJaw, 0.0f);
/**
 * 美型参数:瘦下巴
 * 参数范围:[0,1]
 */
engine.updateFaceShape(FaceShapeType.typeThinJaw, 0.0f);
/**
 * 美型参数:瘦下颌
 * 参数范围:[0,1]
 */
engine.updateFaceShape(FaceShapeType.typeThinMandible, 0.0f);
/**
 * 美型参数:大眼
 * 参数范围:[0,1]
 */
engine.updateFaceShape(FaceShapeType.typeBigEye, 0.0f);
/**
 * 美型参数:眼角1
 * 参数范围:[0,1]
 */
engine.updateFaceShape(FaceShapeType.typeEyeAngle1, 0.0f);
/**
 * 美型参数:眼距
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeCanthus, 0.0f);
/**
 * 美型参数:拉宽眼距
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeCanthus1, 0.0f);
/**
 * 美型参数:眼角2
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeEyeAngle2, 0.0f);
/**
 * 美型参数:眼睛高度
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeEyeTDAngle, 0.0f);
/**
 * 美型参数:瘦鼻
 * 参数范围:[0,1]
 */
engine.updateFaceShape(FaceShapeType.typeThinNose, 0.0f);
/**
 * 美型参数:鼻翼
 * 参数范围:[0,1]
 */
engine.updateFaceShape(FaceShapeType.typeNosewing, 0.0f);
/**
 * 美型参数:鼻长
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeNasalHeight, 0.0f);
/**
 * 美型参数:鼻头长
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeNoseTipHeight, 0.0f);
/**
 * 美型参数:唇宽
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeMouthWidth, 0.0f);
/**
 * 美型参数:嘴唇大小
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeMouthSize, 0.0f);
/**
 * 美型参数:唇高
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeMouthHigh, 0.0f);
/**
 * 美型参数:人中
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typePhiltrum, 0.0f);
/**
 * 美型参数:发际线
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeHairLine, 0.0f);
/**
 * 美型参数:嘴角上扬(微笑)
 * 参数范围:[-1,1]
 */
engine.updateFaceShape(FaceShapeType.typeSmile, 0.0f);

美体

/**
* 美体开关,其中第二个参数是功能开关,第三个参数为调试开关*/
engine.enableBeautyType(BeautyFilterType.kBodyShape, true, false);
/**
* 美体参数:全身
* 参数范围:[-1,1]
*/
engine.updateBodyShape(BodyShapeType.kFullBody, 1.0f);
/**
* 美体参数:小头
* 参数范围:[-1,1]
*/
engine.updateBodyShape(BodyShapeType.kSmallHead, 1.0f);
/**
* 美体参数:瘦腿
* 参数范围:[-1,1]
*/
engine.updateBodyShape(BodyShapeType.kThinLeg, 1.0f);
/**
* 美体参数:长腿
* 参数范围:[-1,1]
*/
engine.updateBodyShape(BodyShapeType.kLongLeg, 1.0f);
/**
* 美体参数:脖子
* 参数范围:[-1,1]
*/
engine.updateBodyShape(BodyShapeType.kLongNeck, 1.0f);
/**
* 美体参数:瘦腰
* 参数范围:[-1,1]
*/
engine.updateBodyShape(BodyShapeType.kThinWaist, 1.0f);
/**
* 美体参数:丰胸
* 参数范围:[-1,1]
*/
engine.updateBodyShape(BodyShapeType.kEnhanceBreast, 1.0f);
/**
* 美体参数:手臂
* 参数范围:[-1,1]
*/
engine.updateBodyShape(BodyShapeType.kThinArm, 1.0f);

美妆

开启妆容

// 第二个参数是开关,第三个参数是调试开关
// 第四个参数是美妆的模式,目前仅对眉毛有作用,设置为BeautyFilterMode.kBMFaceMakeup_High,眉毛的形变会更明显,设置为BeautyFilterMode.kBMFaceMakeup_Baseline,眉形会变收敛
engine.enableBeautyType(BeautyFilterType.kMakeup, true, false, BeautyFilterMode.kBMFaceMakeup_Baseline);

// 设置美妆素材
// 第一个参数是美妆类型
// 第二个参数是素材文件路径,基于assets的相对路径,如"/makeup/蜜桃妆.png",也可以是有读取权限的绝对路径
// 第三个参数是素材与人脸的融合类型,第四个参数是保留参数
engine.setMakeupImage(MakeupType.kMakeupBlush,
           new String[]{""},  
           BlendType.kBlendCurve, 15);
/**
* 整妆的类型是kMakeupWhole,设置单个素材即可实现全脸上妆,但是无法调节各部位细节。
* 升级至1.4.0以上的用户,建议采用组合妆来替换整妆的效果,可以调节各部分细节,下面提供几种组合妆的模式:
* 1、微醺妆:
*   眼影(makeup/eyeshadow/naichazong.2.31.png 透明度:0.7)、
*   睫毛(makeup/eyelash/yesheng.2.31.png 透明度:0.5)、
*   腮红(makeup/blush/weixun.2.31.png 透明度:0.8)、
*   眼线(makeup/eyeliner_292929/wenrou.2.31.png 透明度:0.5)、
*   口红(makeup/mouth_wumian/standout.2.31.png 透明度:0.5)、
*   高光(makeup/highlight/highlight.2.12.png, 透明度:0.4)
* 2、雀斑妆:
*   眼影(makeup/eyeshadow/taohuafen.2.31.png 透明度:0.7)、
*   睫毛(makeup/eyelash/yesheng.2.31.png 透明度:0.5)、
*   腮红(makeup/blush/cool.2.31.png 透明度:0.8)、
*   眼线(makeup/eyeliner_292929/guima.2.31.png 透明度:0.5)、
*   口红(makeup/mouth_yaochun/nanguase.2.31.png 透明度:0.5)、
*   高光(makeup/highlight/highlight.2.12.png, 透明度:0.4)
* 3、活泼妆:
*   眼影(makeup/eyeshadow/tianchengse.2.31.png 透明度:0.7)、
*   睫毛(makeup/eyelash/lingdong.2.31.png 透明度:0.5)、
*   腮红(makeup/blush/luori.2.31.png 透明度:0.8)、
*   眼线(makeup/eyeliner_292929/qizhi.2.31.png 透明度:0.5)、
*   口红(makeup/mouth_yaochun/nanguase.2.31.png 透明度:0.5)、
*   高光(makeup/highlight/highlight.2.12.png, 透明度:0.4)
* 4、夜店妆:
*   眼影(makeup/eyeshadow/yeqiangwei.2.31.png 透明度:0.7)、
*   睫毛(makeup/eyelash/zhixing.2.31.png 透明度:0.5)、
*   腮红(makeup/blush/shaonv.2.31.png 透明度:0.8)、
*   眼线(makeup/eyeliner_292929/wenrou.2.31.png 透明度:0.5)、
*   口红(makeup/mouth_zirun/zhenggongse.2.31.png 透明度:0.5)、
*   高光(makeup/highlight/highlight.2.12.png, 透明度:0.4)
**/

// 设置美妆素材透明度
// 第二个参数是透明度,第三个参数是保留参数
engine.setMakeupAlpha(MakeupType.kMakeupBlush, 0.6f, 0.3f);

关闭妆容

engine.setMakeupImage(MakeupType.kMakeupBlush, new String[], BlendType.kBlendNormal, 15);

开启卧蚕

 // 第二个参数是开关,第三个参数是调试开关
engine.enableBeautyType(BeautyFilterType.kMakeup, true, false);

engine.setMakeupImage(MakeupType.kMakeupWocan,
                      new String[]{""},   //目前采用内置素材,不支持定制  
                      BlendType.kBlendCurve, 15);

engine.setMakeupAlpha(MakeupType.kMakeupWocan, 0.6f, 0.3f);

关闭卧蚕

engine.setMakeupImage(MakeupType.kMakeupWocan, new String[], BlendType.kBlendCurve, 15);

换发色

engine.enableBeautyType(BeautyFilterType.kHairColor, true);
/**
 * 三个参数分别为RGB值(浮点数)
 * 参考颜色如下:
 *   蓝色:  [0.3137f, 0.3137f, 0.6275f]
 *   紫色:  [0.6078f, 0.3529f, 0.6275f])
 *   天蓝色: [0.3333f, 0.5492f, 0.5491f])
 *   黄色:  [0.6471f, 0.5294f, 0.3529f])
 *   绿色:  [0.3725f, 0.5882f, 0.3137f])
 *   棕色:  [0.3922f, 0.3333f, 0.3137f])
 *   红色:  [0.5098f, 0.2745f, 0.2745f])
 */
engine.setHairColor(
  getQueenParam().hairRecord.colorRed,
  getQueenParam().hairRecord.colorGreen,
  getQueenParam().hairRecord.colorBlue);

滤镜

// 功能开关
engine.enableBeautyType(BeautyFilterType.kLUT, true);
// 设置滤镜资源路径,基于assets的相对路径,如“/lookups/lookup_1.png”,也可以是有读取权限的绝对路径
engine.setFilter(lutResPath); 
// 滤镜强度
engine.setBeautyParam(BeautyParams.kBPLUT, 1.0f); 

贴纸

// 删除贴纸素材路径
engine.removeMaterial(oldStickerResPath);
// 添加贴纸素材路径,相同贴纸不能重复添加
// 基于assets的相对路径,如"/sticker/baiyang",也可以是有读取权限的绝对路径
engine.addMaterial(stickerResPath);

蓝/绿幕抠图

/**
 * 设置绿幕抠图参数
 * @param backgroundPath : 要替换的背景资源图文件地址,路径地址为"",则为关闭该项功能
 * @param blueScreenEnabled : 是否使用蓝幕,true为替换蓝幕背景,false则为替换绿幕背景
 * @param threshold 范围:【20,60】,默认建议取值30.    
 */
engine.setGreenScreen(String backgroundPath, boolean blueScreenEnabled, float threshold);

智能抠像

// 开启智能抠像前,可以根据需要设置其性能模式,包括自动模式、最佳画质模式、平衡模式、最佳性能模式,如果不设置则默认为自动模式
engine.setSegmentPerformanceMode(SegmentPerformanceMode.Auto);
// 删除背景素材路径
engine.removeMaterial(oldBackgroundResPath);
// 添加背景素材路径,相同贴纸不能重复添加
// 基于assets的相对路径,如"/static/xiaomanyao",也可以是有读取权限的绝对路径
engine.addMaterial(backgroundResPath);
// 除了上述的替换背景之外,也可以直接开启背景虚化功能
engine.enableBeautyType(BeautyFilterType.kBTBackgroundProcess, true);
// 开启后默认是背景虚化,可以通过如下API设置为背景透明,适用于将输出当做前景,自行合成背景的场合
engine.setSegmentBackgroundProcessType(BackgroundProcessType.kBackgroundTransparent);

AR隔空写字

/**
 * 第一个参数是开关
 * 第二个参数是模式: 1 - 写字, 2 - 画画
 */
engine.setArWriting(true, getQueenParam().sArWritingRecord.mode);

智能动态化

// 开启智能动态优化:
engine.enableBeautyType(BeautyFilterType.kBTAutoFilter, true);
// 关闭智能动态优化:
engine.enableBeautyType(BeautyFilterType.kBTAutoFilter, false);

手势识别接入说明

注册和注销算法回调。

/** 注册算法回调 **/
// 利用QueenEngine的句柄,创建一个算法实例,注册之后,对应的算法就会被执行
// 第三个参数就是算法类型,具体参考AlgType类
// 以下是手势识别算法的例子
Algorithm algorithm = new Algorithm(engine.getEngineHandler(), "", com.taobao.android.libqueen.models.AlgType.kAAiGestureDetect);
algorithm.registerAlgCallBack(new Algorithm.OnAlgDetectListener() {
  @Override
  public int onAlgDetectFinish(int algId, Object algResult) {
    if (algResult instanceof com.taobao.android.libqueen.algorithm.GestureData) {
      // GestureData包含静态手势和动作手势
      com.taobao.android.libqueen.algorithm.GestureData gestureData = (com.taobao.android.libqueen.algorithm.GestureData) algResult;
    }
    return 0;
  }
});

/** 注销算法回调 **/
// 如果是绑定Algorithm的QueenEngine没有销毁,那么需要手动注销算法回调;如果QueenEngine被销毁了,那么Algorithm实例会自动失效。
algorithm.unRegisterAlgCallBack();

动作检测接入说明

注册和注销算法回调。

/** 注册算法回调 **/
// 利用QueenEngine的句柄,创建一个算法实例,注册之后,对应的算法就会被执行
// 第三个参数就是算法类型,具体参考AlgType类
// 以下是动作检测算法的例子
Algorithm algorithm = new Algorithm(engine.getEngineHandler(), "", com.taobao.android.libqueen.models.AlgType.kQueenAIBodySportDetect);
algorithm.registerAlgCallBack(new Algorithm.OnAlgDetectListener() {
  @Override
  public int onAlgDetectFinish(int algId, Object algResult) {
    if (algResult instanceof BodyDetectData) {
          BodyDetectData resultData = (BodyDetectData)algResult;
          int sportType = resultData.getBodySportType();
          if (sportType <= 0) {
            // 姿态识别
            int poseType = resultData.getBodyPoseType();
            sb.append("【姿态识别】:").append(getBodyPoseName(poseType));
          } else {
            // 特定动作计数
            int sportCount = resultData.getBodySportCount();
            sb.append("【动作】:").append(getBodySportPoseName(sportType)).append("\r\n")
              .append("【计数】:").append(sportCount);
          }
        }
    return 0;
  }
});

/** 注销算法回调 **/
// 如果是绑定Algorithm的QueenEngine没有销毁,那么需要手动注销算法回调;如果QueenEngine被销毁了,那么Algorithm实例会自动失效。
algorithm.unRegisterAlgCallBack();

资源下载能力

// 初始化资源下载能力
QueenMaterial.getInstance().init(context);

// 设置资源下载监听
QueenMaterial.getInstance().setCallback(new QueenMaterial.OnMaterialCallback() {

    @Override
    public void onReady(QueenMaterial.MaterialType materialType) {
        // 非UI线程回调资源下载完成(常规操作是关闭加载框,并触发业务逻辑)

        // 贴纸
        String stickerName = "1"; // 贴纸的相对路径
        String stickerPath = QueenMaterial.getInstance().getMaterialPath(QueenMaterial.MaterialType.STICKER) + File.separator + stickerName;
        // 将stickerPath配置到QueenEngine
        engine.addMaterial(stickerResPath);
    }

    @Override
    public void onProgress(QueenMaterial.MaterialType materialType, int currentSize, int totalSize, float progress) {
        // 非UI线程资源下载进度(常规操作是更新加载进度)
    }

    @Override
    public void onError(QueenMaterial.MaterialType materialType) {
        // 非UI线程资源下载错误(常规操作是关闭加载框,并提示用户检查网络和磁盘空间)
    }

});