Android

統合の準備

1. SDKのダウンロードを実行し、解凍します。
2. 以下のファイルを準備します。
ファイルタイプ
説明
xmagic-xxx.aar
SDK。入力必須
../assets/
アルゴリズムモデル、素材リソースパック。入力必須
../jniLibs
soライブラリ。入力必須

リソースのインポート

手動統合
Mavenの統合
動的ダウンロードと統合

統合

上記で準備したすべての.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ライブラリを統合していない場合は、次の依存も追加する必要があります。
ご注意:
プロジェクトにGoogleのGsonライブラリを統合していない場合は、次の依存も追加する必要があります。
dependencies{
implementation 'com.google.code.gson:gson:2.8.2'
}

Tencent Effect SDKはMaven Central Repositoryに公開済みであり、gradleの設定によって自動でダウンロードおよび更新が可能です。
1. dependenciesにTencent Effect SDKの依存を追加します。
dependencies{
//例:S1-04パッケージの場合
implementation 'com.tencent.mediacloud:TencentEffect_S1-04:latest.release'
}
2. defaultConfigでAppが使用するCPUアーキテクチャを指定します。
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
説明:
現在、Tencent Effect SDKはarmeabi-v7aおよびarm64-v8aをサポートしています。
3. 
img

Sync Nowをクリックすると、SDKが自動的にダウンロードされプロジェクトに統合されます。
4. パッケージに動的エフェクトおよびフィルター機能が含まれる場合は、SDKダウンロードページで対応するリソースをダウンロードし、動的エフェクトおよびフィルター素材をプロジェクトの以下のディレクトリに配置する必要があります。
動的エフェクト:../assets/MotionRes
フィルター:../assets/lut

各パッケージに対応するMavenアドレス

バージョン
Mavenアドレス
A1 - 01
implementation 'com.tencent.mediacloud:TencentEffect_A1-01:latest.release'
A1 - 02
implementation 'com.tencent.mediacloud:TencentEffect_A1-02:latest.release'
A1 - 03
implementation 'com.tencent.mediacloud:TencentEffect_A1-03:latest.release'
A1 - 04
implementation 'com.tencent.mediacloud:TencentEffect_A1-04:latest.release'
A1 - 05
implementation 'com.tencent.mediacloud:TencentEffect_A1-05:latest.release'
A1 - 06
implementation 'com.tencent.mediacloud:TencentEffect_A1-06:latest.release'
S1 - 00
implementation 'com.tencent.mediacloud:TencentEffect_S1-00:latest.release'
S1 - 01
implementation 'com.tencent.mediacloud:TencentEffect_S1-01:latest.release'
S1 - 02
implementation 'com.tencent.mediacloud:TencentEffect_S1-02:latest.release'
S1 - 03
implementation 'com.tencent.mediacloud:TencentEffect_S1-03:latest.release'
S1 - 04
implementation 'com.tencent.mediacloud:TencentEffect_S1-04:latest.release'


assets、so、動的エフェクトリソースガイドの動的ダウンロード

パッケージのサイズを小さくするため、SDKに必要なassetsリソース、soライブラリ、および動的エフェクトリソースMotionRes(一部のベーシック版SDKには動的エフェクトリソースはありません)をネットワークからのダウンロードに変更することができます。ダウンロード成功後、上記ファイルのパスをSDKに設定します。
Demoのダウンロードロジックを再利用することをお勧めします。もちろん、既存のダウンロードサービスを使用することもできます。動的ダウンロードの詳細なガイドについては、SDKパッケージのスリム化(Android)をご参照ください。

全体フロー

手順1:認証

1. 権限の承認を申請し、License URLとLicense KEYを取得します。
ご注意:
正常な状況では、Appのネットワーク接続が一度成功すれば認証フローは完了するため、Licenseファイルをプロジェクトのassetsディレクトリに保存する必要はありません。ただし、Appがネットワークに未接続の状態でSDKの関連機能を使用する必要がある場合は、Licenseファイルをダウンロードしてassetsディレクトリに保存し、最低保証プランとすることができます。この場合、Licenseファイル名は必ずv_cube.licenseとしなければなりません。
2. 関連業務モジュールの初期化コードの中でURLとKEYを設定し、licenseのダウンロードをトリガーします。使用する直前になってダウンロードすることは避けてください。ApplicationのonCreateメソッドでダウンロードをトリガーすることもできますが、この時点でネットワークの権限がない可能性や、ネットワーク接続の失敗率が比較的高い可能性があるため、推奨しません。
//ダウンロードのトリガーまたはlicenseの更新のみが目的であり、認証結果には関心がない場合は、4つ目のパラメータには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の失敗による可能性があります
-5
読み取ったVCUBE TEMP Licenseファイルの内容が空です。IOの失敗による可能性があります
-6
v_cube.licenseファイルのJSONフィールドが正しくありません。Tencent Cloudチームに連絡して処理を依頼してください
-7
署名の検証に失敗しました。Tencent Cloudチームに連絡して処理を依頼してください
-8
復号に失敗しました。Tencent Cloudチームに連絡して処理を依頼してください
-9
TELicenseフィールド内のJSONフィールドが正しくありません。Tencent Cloudチームに連絡して処理を依頼してください
-10
ネットワークから解析したTE権限承認情報が空です。Tencent Cloudチームに連絡して処理を依頼してください
-11
TE権限承認情報をローカルファイルに書き込む際に失敗しました。IOの失敗による可能性があります
-12
ダウンロードに失敗しました。ローカルassetの解析も失敗しました
-13
認証に失敗しました。soがパッケージ内にあるか、またはsoパスが正しく設定されているかを確認してください
3004/3005
権限承認が無効です。Tencent Cloudチームに連絡して処理を依頼してください
3015
Bundle Id / Package Name が一致しません。Appで使用しているBundle Id / Package Nameが申請時のものと同じか、正しい権限承認ファイルを使用しているかを確認してください
3018
権限承認ファイルが期限切れです。Tencent Cloudに更新を申請する必要があります
その他
Tencent Cloudチームに連絡して処理を依頼してください

手順2:リソースのコピー

1. リソースファイルがassetsディレクトリ内にある場合は、使用する前にappのプライベートディレクトリにコピーしておく必要があります。事前にコピーしておくか、または前の手順の認証成功のコールバックの中でコピー操作を行うこともできます。サンプルコードは、DemoのLaunchActivity.javaです。
XmagicResParser.setResPath(new File(getFilesDir(), "xmagic").getAbsolutePath());
//loading

//リソースファイルのプライベートディレクトリへのコピーは1回のみ行います
XmagicResParser.copyRes(getApplicationContext());
2. リソースファイルがネットワークから動的ダウンロードしたものの場合は、ダウンロード成功後にリソースファイルパスを設定する必要があります。サンプルコードは、DemoのLaunchActivity.javaです。
XmagicResParser.setResPath(ダウンロードしたリソースファイルのローカルパス);

手順3:SDKの初期化および使用方法

Tencent Effect 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ドキュメントをご参照ください。
5. 素材プロンプトのコールバック関数を追加します(メソッドのコールバックはサブスレッドで実行される場合があります)。一部の素材はユーザーに、うなずく、手を伸ばす、指ハートなどを促します。このコールバックは類似のプロンプトの表示に用いられます。
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();
}
});
6. 美顔SDKが各フレームのデータを処理し、対応する処理結果を返します。
int outTexture = mXmagicApi.process(textureId, textureWidth, textureHeight);
7. 指定するタイプの美顔エフェクトの数値を更新します。
// 使用可能な入力パラメータのプロパティはXmagicResParser.parseRes()から取得できます
mXmagicApi.updateProperty(XmagicProperty<?> p);
8. 美顔SDKをPauseします。ActivityのonPause()ライフサイクルにバインドすることをお勧めします。
//ActivityがonPauseの場合に呼び出します。OpenGLスレッドで呼び出す必要があります
mXmagicApi.onPause();
9. 美顔SDKをリリースします。ActivityのonDestroy() ライフサイクルにバインドすることをお勧めします。
//このメソッドはGLスレッドで呼び出す必要があることにご注意ください
mXmagicApi.onDestroy()