Android

통합 준비

  1. SDK Download 후 압축을 해제합니다.
  2. 다음 파일 준비:
    파일 유형설명
    xmagic-xxx.aarSDK, 필수
    ../assets/알고리즘 모델, 소재 리소스 패키지, 필수
    ../jniLibsso 라이브러리, 필수

리소스 가져오기

통합

  • 상기 파일로 준비된 모든 .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
}

주의

Google의 Gson 라이브러리가 프로젝트에 통합되지 않은 경우 다음 종속성을 추가해야 합니다.

dependencies{
   implementation 'com.google.code.gson:gson:2.8.2'
}

전체 프로세스

1단계: 인증

  1. 라이선스를 신청하고 License URL과 License KEY를 받습니다.

    주의:

    일반적인 상황에서는 App이 한 번만 성공적으로 연결되면 인증 프로세스가 완료되므로 License 파일을 프로젝트의 assets 디렉터리에 넣을 필요가 없습니다. 그러나 만약 App이 인터넷에 연결되지 않은 상태에서도 SDK 관련 기능을 사용하려면 License 파일을 assets 디렉터리에 다운로드하여 기본 설정으로 사용할 수 있습니다. 이 때 License 파일 이름은 v_cube. license이어야 합니다.

  2. 해당 비즈니스 모듈의 초기화 코드에 URL과 KEY를 설정하여 License 다운로드를 트리거하여 사용 전 일시적으로 다운로드되는 것을 방지합니다. Application의 onCreate 메소드에서 다운로드를 트리거하는 것도 가능하지만, 이때 네트워크 권한이 없거나 네트워크 실패율이 높을 수 있기 때문에 권장하지 않습니다.

    //license를 다운로드하거나 업데이트하기 위한 것일 뿐 인증 결과에 신경 쓰지 않는다면 네 번째 매개변수가 null로 전달됩니다.
    TELicenseCheck.getInstance().setXMagicLicense(context, URL, KEY, null);
    
  3. 그런 다음 실제로 뷰티 필터 기능(예시: Demo의 'LaunchActivity.java')을 사용하기 전에 인증을 수행합니다.

    // 네트워크에서 so 라이브러리를 다운로드한 경우 TELicenseCheck.getInstance().setTELicense를 호출하기 전에 so 경로를 설정하십시오. 그렇지 않으면 인증이 실패합니다.
    // XmagicApi.setLibPathAndLoad(validLibsDirectory);
    // so가 apk 패키지에 내장되어 있으면 위의 메소드를 호출할 필요가 없습니다.
    TELicenseCheck.getInstance().setTELicense(context, URL, KEY, new TELicenseCheckListener() {
             @Override
            public void onLicenseCheckFinish(int errorCode, String msg) {
                //주의: 스레드 호출이 꼭 필요한 것은 아닙니다.
                if (errorCode == TELicenseCheck.ERROR_OK) {
                    //인증 성공
                } else {
                    //인증 실패
                }
            }
        });
    

인증 errorCode 설명:

에러 코드설명
0성공. Success
-1잘못된 입력 매개변수, 예시: 빈 URL 또는 KEY
-3다운로드 실패, 네트워크 설정 확인
-4로컬에서 읽은 TE 인증 정보가 비어 있음, 이는 IO 실패로 인해 발생한 것일 수 있습니다.
-5VCUBE TEMP License 파일 읽기 내용이 비어 있습니다. 이는 IO 실패로 인한 것일 수 있습니다.
-6v_cube.license 파일 JSON 필드가 잘못되었습니다. 처리를 위해 Tencent Cloud 팀에 문의하십시오.
-7서명 인증 실패. 처리를 위해 Tencent Cloud 팀에 문의하십시오.
-8복호화 실패. 처리를 위해 Tencent Cloud 팀에 문의하십시오.
-9TELicense 필드의 JSON 필드가 올바르지 않습니다. 처리를 위해 Tencent Cloud 팀에 문의하십시오.
-10네트워크에서 리졸브된 TE 인증 정보가 비어 있습니다. 처리를 위해 Tencent Cloud 팀에 문의하십시오.
-11IO 실패로 인해 로컬 파일에 TE 인증 정보를 쓰지 못했습니다.
-12다운로드에 실패했으며 로컬 asset의 리졸브도 실패했습니다.
-13인증에 실패했습니다. 패키지에 so가 있는지 확인하거나 so 경로가 올바르게 설정되었는지 확인하십시오.
3004/3005인증이 잘못되었습니다. Tencent Cloud 팀에 문의하십시오.
3015Bundle Id / Package Name이 일치하지 않습니다. App 에서 사용하는 Bundle Id / Package Name이 신청한 것과 동일한지 확인하고 올바른 인증 파일이 사용되었는지 확인하십시오.
3018인증 파일이 만료되었으므로 Tencent Cloud에 연장을 신청해야 합니다.
기타Tencent Cloud 팀에 문의하십시오.

2단계: 리소스 복사

  1. 리소스 파일이 assets 디렉터리에 내장된 경우 사용하기 전에 app의 개인 디렉터리에 copy해야 합니다. 미리 copy하거나 이전 단계에서 인증 성공 콜백에서 복사 작업을 수행할 수 있습니다. 예시 코드는 Demo의 'LaunchActivity.java'에 있습니다.

    XmagicResParser.setResPath(new File(getFilesDir(), "xmagic").getAbsolutePath());
    //loading
    // 리소스 파일을 프라이빗 디렉터리에 copy합니다. 한 번만 수행하면 됩니다.
    XmagicResParser.copyRes(getApplicationContext());
    
  2. 동적 네트워크 다운로드에서 리소스 파일을 다운로드한 경우 다운로드가 성공한 후 리소스 파일 경로를 설정해야 합니다. 예시 코드는 Demo의 'LaunchActivity.java'에 있습니다.

    XmagicResParser.setResPath(다운로드한 리소스 파일 로컬 경로);
    

3단계: SDK 초기화 및 사용 방법

Tencent 특수 효과 SDK를 사용하는 라이프사이클은 대략 다음과 같습니다.

  1. 뷰티 필터 UI 데이터 구성은 Demo 프로젝트를 참고하십시오.XmagicResParser.java,XmagicUIProperty.java,XmagicPanelDataManager.java 코드.

  2. 미리보기 레이아웃에 GLSurfaceView를 추가합니다.

    <android.opengl.GLSurfaceView
    android:id="@+id/camera_gl_surface_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
    
  3. (옵션) 카메라를 빠르게 구현합니다.
    Demo 프로젝트의 com.tencent.demo.camera 디렉터리를 프로젝트에 복사합니다. 카메라 기능을 빠르게 구현하려면 'PreviewMgr' 클래스를 사용하십시오. 자세한 구현 방법은 Demo 프로젝트의 'MainActivity.java'를 참고하십시오.

    //카메라 초기화
    mPreviewMgr = new PreviewMgr();
    //레이아웃의 GlSurfaceView 예제를 카메라 툴 클래스에 전달
    mPreviewMgr.onCreate(mGlSurfaceView,false);
    //미리보기 텍스처 데이터 콜백 함수 가입
    mPreviewMgr.setCustomTextureProcessor((textureId, textureWidth, textureHeight) -> {
    if (mXmagicApi == null) {
         return textureId;
    }
    //렌더링을 위해 뷰티 필터 sdk 호출
    int outTexture = mXmagicApi.process(textureId, textureWidth, textureHeight);
    return outTexture;
    });
    //Activity의 onResume 메소드에서 카메라 실행
    mPreviewMgr.onResume(this, 1280, 720);
    
  4. 뷰티 필터 SDK를 초기화하고 Activity의 'onResume()' 메소드에 넣는 것을 권장합니다.

    mXmagicApi = new XmagicApi(this, XmagicResParser.getResPath(),new XmagicApi.OnXmagicPropertyErrorListener()); 
    
  • 매개변수

    매개변수의미
    Context context컨텍스트
    String resDir리소스 파일 디렉터리, 자세한 내용은 2단계를 참고하십시오.
    OnXmagicPropertyErrorListener errorListener콜백 함수 구현 클래스
  • 반환
    오류 코드 의미는 API 문서를 참고하십시오.

  1. 소재 프롬프트 콜백 함수를 추가합니다(메소드 콜백은 서브 스레드에서 실행될 수 있음). 고개 끄덕임, 손바닥 내밀기, 손 하트 등 일부 소재는 사용자에게 프롬프트를 표시합니다. 이 콜백은 바로 유사한 프롬프트를 보여주기 위한 것입니다.
    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();
    }
    });
    
  1. 뷰티 필터 SDK는 데이터의 각 프레임을 처리하고 해당 처리 결과를 반환합니다.
    int outTexture = mXmagicApi.process(textureId, textureWidth, textureHeight);
    
  1. 지정된 유형의 뷰티 필터 특수 효과 값을 업데이트합니다.

    // 사용 가능한 입력 속성은 XmagicResParser.parseRes()에서 가져오기
    mXmagicApi.updateProperty(XmagicProperty<?> p);
    
  2. 뷰티 필터 SDK를 Pause하려면 Activity의 'onPause()' 라이프사이클로 바인딩하는 것이 좋습니다.

    //Activity의 onPause 시 호출되며 OpenGL 스레드에서 호출되어야 합니다.
    mXmagicApi.onPause();
    
  3. 뷰티 필터 SDK를 릴리스하고 Activity의 'onDestroy()' 라이프사이클과 바인딩하는 것이 좋습니다.

    //이 메소드는 GL 스레드에서 호출되어야 합니다.
    mXmagicApi.onDestroy()