Android
統合の準備
1. SDKのダウンロードを実行し、解凍します。
2. 以下のファイルを準備します。
ファイルタイプ | 説明 |
xmagic-xxx.aar | SDK。入力必須 |
../assets/ | アルゴリズムモデル、素材リソースパック。入力必須 |
../jniLibs | soライブラリ。入力必須 |
リソースのインポート
統合
上記で準備したすべての
.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.
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() {@Overridepublic 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.GLSurfaceViewandroid: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 | |
OnXmagicPropertyErrorListener errorListener | コールバック関数実装クラス |
戻り値
5. 素材プロンプトのコールバック関数を追加します(メソッドのコールバックはサブスレッドで実行される場合があります)。一部の素材はユーザーに、うなずく、手を伸ばす、指ハートなどを促します。このコールバックは類似のプロンプトの表示に用いられます。
mXmagicApi.setTipsListener(new XmagicTipsListener() {final XmagicToast mToast = new XmagicToast();@Overridepublic void tipsNeedShow(String tips, String tipsIcon, int type, int duration) {mToast.show(MainActivity.this, tips, duration);}@Overridepublic 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()