Android
統合の準備
- SDKのダウンロードを実行し、解凍します。
- 以下のファイルを準備します。
ファイルタイプ 説明 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ライブラリを統合していない場合は、次の依存も追加する必要があります。
dependencies{ implementation 'com.google.code.gson:gson:2.8.2' }
全体フロー
手順1:認証
権限の承認を申請し、License URLとLicense KEYを取得します。
注意:正常な状況では、Appのネットワーク接続が一度成功すれば認証フローは完了するため、Licenseファイルをプロジェクトのassetsディレクトリに保存する必要はありません。ただし、Appがネットワークに未接続の状態でSDKの関連機能を使用する必要がある場合は、Licenseファイルをダウンロードしてassetsディレクトリに保存し、最低保証プランとすることができます。この場合、Licenseファイル名は必ず
v_cube.license
としなければなりません。関連業務モジュールの初期化コードの中でURLとKEYを設定し、licenseのダウンロードをトリガーします。使用する直前になってダウンロードすることは避けてください。ApplicationのonCreateメソッドでダウンロードをトリガーすることもできますが、この時点でネットワークの権限がない可能性や、ネットワーク接続の失敗率が比較的高い可能性があるため、推奨しません。
//ダウンロードのトリガーまたはlicenseの更新のみが目的であり、認証結果には関心がない場合は、4つ目のパラメータにはnullを渡します。 TELicenseCheck.getInstance().setXMagicLicense(context, URL, KEY, null);
その後、実際に美顔機能を使用する前に(例えば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:リソースのコピー
リソースファイルがassetsディレクトリ内にある場合は、使用する前にappのプライベートディレクトリにコピーしておく必要があります。事前にコピーしておくか、または前の手順の認証成功のコールバックの中でコピー操作を行うこともできます。サンプルコードは、Demoの
LaunchActivity.java
です。XmagicResParser.setResPath(new File(getFilesDir(), "xmagic").getAbsolutePath()); //loading //リソースファイルのプライベートディレクトリへのコピーは1回のみ行います XmagicResParser.copyRes(getApplicationContext());
リソースファイルがネットワークから動的ダウンロードしたものの場合は、ダウンロード成功後にリソースファイルパスを設定する必要があります。サンプルコードは、Demoの
LaunchActivity.java
です。XmagicResParser.setResPath(ダウンロードしたリソースファイルのローカルパス);
手順3:SDKの初期化および使用方法
Tencent Effect SDK使用のライフサイクルはおおむね次のとおりです。
美顔UIデータを作成します。Demoプロジェクトのものを参照できます。
XmagicResParser.java,XmagicUIProperty.java,XmagicPanelDataManager.java
コード。プレビューレイアウトにGLSurfaceViewを追加します。
<android.opengl.GLSurfaceView android:id="@+id/camera_gl_surface_view" android:layout_width="match_parent" android:layout_height="match_parent" />
(オプション)カメラをクイック実装します。
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);
美顔SDKを初期化します。Activityの
onResume()
メソッドに保存することをお勧めします。mXmagicApi = new XmagicApi(this, XmagicResParser.getResPath(),new XmagicApi.OnXmagicPropertyErrorListener());
パラメータ
パラメータ 意味 Context context コンテキスト String resDir リソースファイルディレクトリ。詳細については、手順2をご参照ください OnXmagicPropertyErrorListener errorListener コールバック関数実装クラス 戻り値
エラーコードの意味についてはAPIドキュメントをご参照ください。
素材プロンプトのコールバック関数を追加します(メソッドのコールバックはサブスレッドで実行される場合があります)。一部の素材はユーザーに、うなずく、手を伸ばす、指ハートなどを促します。このコールバックは類似のプロンプトの表示に用いられます。
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(); } });
美顔SDKが各フレームのデータを処理し、対応する処理結果を返します。
int outTexture = mXmagicApi.process(textureId, textureWidth, textureHeight);
指定するタイプの美顔エフェクトの数値を更新します。
// 使用可能な入力パラメータのプロパティはXmagicResParser.parseRes()から取得できます mXmagicApi.updateProperty(XmagicProperty<?> p);
美顔SDKをPauseします。Activityの
onPause()
ライフサイクルにバインドすることをお勧めします。//ActivityがonPauseの場合に呼び出します。OpenGLスレッドで呼び出す必要があります mXmagicApi.onPause();
美顔SDKをリリースします。Activityの
onDestroy()
ライフサイクルにバインドすることをお勧めします。//このメソッドはGLスレッドで呼び出す必要があることにご注意ください mXmagicApi.onDestroy()