製品概要
製品の利点
応用シナリオ




dependencies {// TRTC Lite版SDK、TRTCとライブ再生の2つの機能を含みます。implementation 'com.tencent.liteav:LiteAVSDK_TRTC:latest.release'// IM SDKを追加、最新のバージョン番号を記入することがお勧めです。implementation 'com.tencent.imsdk:imsdk-plus:Version number'// Quicプラグインを追加する必要がある場合、次の行のコメントを解除(注意:プラグインのバージョン番号とIM SDKのバージョン番号が同じである必要がある)// implementation 'com.tencent.imsdk:timquic-plugin:Version number'}
defaultConfig {ndk {abiFilters "armeabi-v7a", "arm64-v8a"}}
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.camera.autofocus" />
android:hardwareAccelerated="false"を設定しないでください。ハードウェアアクセラレーションをオフにすると、相手のビデオストリームがレンダリングできなくなります。targetSdkVersionが31または対象デバイスがAndroid 12以上のシステムバージョンに関連している場合、Bluetooth機能を正常に使用するため、公式にはコード内でandroid.permission.BLUETOOTH_CONNECT権限を動的な申請する必要があります。詳細はBluetooth権限を参照してください。-keep class com.tencent.** { *; }

// イベントリスナーを追加V2TIMManager.getInstance().addIMSDKListener(imSdkListener);// IM SDKを初期化、このインターフェースを呼び出した後、すぐにログインインターフェースを呼び出すことができます。V2TIMManager.getInstance().initSDK(context, sdkAppID, null);// SDK初期化後にはいくつかのイベントが発生します。例えば、接続状態、ログインチケットの有効期限切れなど。private V2TIMSDKListener imSdkListener = new V2TIMSDKListener() {@Overridepublic void onConnecting() {Log.d(TAG, "IM SDKがTencent Cloudクラウドサーバーに接続中");}@Overridepublic void onConnectSuccess() {Log.d(TAG, "IM SDKはすでにTencent Cloudクラウドサーバーに接続しました");}};// イベントリスナーを削除V2TIMManager.getInstance().removeIMSDKListener(imSdkListener);// IM SDKの初期化解除V2TIMManager.getInstance().unInitSDK();
// TRTC SDKのインスタンスを作成する(シングルトンパターン)TRTCCloud mTRTCCloud = TRTCCloud.sharedInstance(context);// TRTCイベントリスナーを追加mTRTCCloud.addListener(trtcSdkListener);// SDKからの各種イベント通知(例:エラーコード、警告コード、オーディオ・ビデオの状態パラメータなど)private TRTCCloudListener trtcSdkListener = new TRTCCloudListener() {@Overridepublic void onError(int errCode, String errMsg, Bundle extraInfo) {Log.d(TAG, errCode + errMsg);}@Overridepublic void onWarning(int warningCode, String warningMsg, Bundle extraInfo) {Log.d(TAG, warningCode + warningMsg);}};// TRTCイベントリスナーを削除mTRTCCloud.removeListener(trtcSdkListener);// TRTC SDKインスタンスを破棄する(シングルトンパターン)TRTCCloud.destroySharedInstance();
// ログイン:userIDはカスタマイズ可能、userSigはステップ1を参照して取得します。V2TIMManager.getInstance().login(userID, userSig, new V2TIMCallback() {@Overridepublic void onSuccess() {Log.i("imsdk", "success");}@Overridepublic void onError(int code, String desc) {// 以下のエラーコードが返された場合、UserSigの使用期限が切れている。新しく発行されたUserSigを使用して再ログインします。// 1. ERR_USER_SIG_EXPIRED(6206)// 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001)// 注意:他のエラーコードの場合、IM SDKのログインが無限ループになる恐れがありますので、ログインインターフェースをここで呼び出さないでください。Log.i("imsdk", "failure, code:" + code + ", desc:" + desc);}});
// ログアウトV2TIMManager.getInstance().logout(new V2TIMCallback() {@Overridepublic void onSuccess() {Log.i("imsdk", "success");}@Overridepublic void onError(int code, String desc) {Log.i("imsdk", "failure, code:" + code + ", desc:" + desc);}});
// ビデオエンコードのパラメータを設定し、リモートのユーザーが見る画面の品質を決定TRTCCloudDef.TRTCVideoEncParam encParam = new TRTCCloudDef.TRTCVideoEncParam();encParam.videoResolution = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_960_540;encParam.videoFps = 15;encParam.videoBitrate = 850;encParam.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT;mTRTCCloud.setVideoEncoderParam(encParam);// ローカルのカメラプレビューを開始(イン/アウトカメラを指定してビデオキャプチャーが可能)mTRTCCloud.startLocalPreview(isFrontCamera, previewView);
// カスタムデータの構築JSONObject jsonObject = new JSONObject();try {jsonObject.put("cmd", "av_call");JSONObject msgJsonObject = new JSONObject();msgJsonObject.put("callType", "videoCall"); // 通話タイプ(ビデオ通話、ボイス通話)を指定msgJsonObject.put("roomId", generateRoomId()); // TRTCルーム番号を指定(発信側でランダム生成)jsonObject.put("msg", msgJsonObject);} catch (JSONException e) {e.printStackTrace();}String data = jsonObject.toString();// 通話招待シグナルを送信V2TIMManager.getSignalingManager().invite(receiver, data, false, v2TIMOfflinePushInfo, timeout, new V2TIMCallback() {@Overridepublic void onError(int code, String desc) {// 通話招待シグナルの送信に失敗// 発信失敗、再試行可能}@Overridepublic void onSuccess() {// 通話招待シグナルの送信に成功// 発信ページをレンダリングし、呼出音を再生}});
v2TIMOfflinePushInfoを設定する必要があります。詳細はオフラインプッシュメッセージを参照してください。timeoutを設定することをお勧めします。単位は秒です。SDKはタイムアウトしたかを検知し、発信がタイムアウトした時の自動切断を実現します。// 着信ユーザーが発信リクエストを受信し、inviteIDはそのリクエストのためのID、inviterは発信ユーザーのIDです。V2TIMManager.getSignalingManager().addSignalingListener(new V2TIMSignalingListener() {@Overridepublic void onReceiveNewInvitation(String inviteID, String inviter,String groupId, List<String> inviteeList, String data) {if (!data.isEmpty()) {try {JSONObject jsonObject = new JSONObject(data);String command = jsonObject.getString("cmd");JSONObject messageJsonObject = jsonObject.getJSONObject("msg");if (command.equals("av_call")) {String callType = messageJsonObject.getString("callType");String roomId = messageJsonObject.getString("roomId");// 発信ページをレンダリングし、呼出音を再生}} catch (JSONException e) {e.printStackTrace();}}}});
if (callType.equals("videoCall")) {// ビデオエンコードのパラメータを設定し、リモートのユーザーが見る画面の品質を決定TRTCCloudDef.TRTCVideoEncParam encParam = new TRTCCloudDef.TRTCVideoEncParam();encParam.videoResolution = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_960_540;encParam.videoFps = 15;encParam.videoBitrate = 850;encParam.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT;mTRTCCloud.setVideoEncoderParam(encParam);// ローカルのカメラプレビューを開始(イン/アウトカメラを指定してビデオキャプチャーが可能)mTRTCCloud.startLocalPreview(isFrontCamera, previewView);}
V2TIMManager.getSignalingManager().cancel(inviteId, data, new V2TIMCallback() { @Override public void onError(int code, String desc) { // 呼び出しのキャンセルに失敗しました// 提示のキャンセルに失敗しました。再試行してみてください。 } @Override public void onSuccess() { // 呼び出しをキャンセルしました// 発信ページが破棄され、呼び出し音の再生が停止します } });
@Override public void onInvitationCancelled(String inviteID, String inviter, String data) {// 発信ページが破棄され、呼び出し音の再生が停止します }
@Overridepublic void onInvitationTimeout(String inviteID, List<String> inviteeList) {// タイムアウトの通知、ページの破棄、呼出着信音の再生停止}
V2TIMManager.getSignalingManager().accept(inviteId, data, new V2TIMCallback() { @Override public void onError(int code, String desc) { // 応答に失敗、「例外が発生しました」、「再試行してください」が表示されます。 } @Override public void onSuccess() { // 応答に成功、通話ページをレンダリング、呼出音の再生が停止します。if (callType.equals("videoCall")) {// ビデオ通話を開始startVideoCall();} else {// ボイス通話を開始startAudioCall();} } });
@Overridepublic void onInviteeAccepted(String inviteID, String invitee, String data) {if (callType.equals("videoCall")) {// ビデオ通話を開始startVideoCall();} else {// ボイス通話を開始startAudioCall();}}
private void startAudioCall() {TRTCCloudDef.TRTCParams params = new TRTCCloudDef.TRTCParams(); params.sdkAppId = SDKAPPID; // TRTCアプリケーションID、コントロールパネルで取得 params.userSig = USERSIG; // TRTC認証クレデンシャル、サーバー側で生成params.strRoomId = roomId; // 部屋番号、文字列の部屋番号を例に params.userId = userId; // ユーザー名はIMに同期することをお勧めしますmTRTCCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_SPEECH);mTRTCCloud.enterRoom(params, TRTCCloudDef.TRTC_APP_SCENE_AUDIOCALL);}
TRTC_APP_SCENE_AUDIOCALLを選択する必要があります。入室ロールTRTCRoleTypeを指定しないでください。startLocalAudioを開始する時、音質パラメータを設定できます。ボイス通話モードではTRTC_AUDIO_QUALITY_SPEECHに設定することをお勧めします。// 通話の状態をラベリングするboolean isOnCalling = false;// 入室結果イベントコールバック@Overridepublic void onEnterRoom(long result) {if (result > 0) {// 入室成功、通話中であることをラベリングするisOnCalling = true;} else {// 入室失敗、通話異常を表示isOnCalling = false;}}
private void startVideoCall() {TRTCCloudDef.TRTCParams params = new TRTCCloudDef.TRTCParams();params.sdkAppId = SDKAPPID; // TRTCアプリケーションID、コントロールパネルで取得params.userSig = USERSIG; // TRTC認証クレデンシャル、サーバー側で生成params.strRoomId = roomId; // 部屋番号、文字列の部屋番号を例にparams.userId = userId; // ユーザー名はIMに同期することをお勧めしますmTRTCCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_SPEECH);mTRTCCloud.enterRoom(params, TRTCCloudDef.TRTC_APP_SCENE_VIDEOCALL);}
TRTC_APP_SCENE_VIDEOCALLを選択する必要があります。入室ロールTRTCRoleTypeを指定しないでください。startLocalAudioを開始する時、音質パラメータを設定できます。ビデオ通話モードではTRTC_AUDIO_QUALITY_SPEECHに設定することをお勧めします。startRemoteViewを呼び出してリモートビデオストリームをプルしてレンダリングし再生する必要があります。// 通話の状態をラベリングするboolean isOnCalling = false;// 入室結果イベントコールバック@Overridepublic void onEnterRoom(long result) {if (result > 0) {// 入室成功、通話中であることをラベリングするisOnCalling = true;} else {// 入室失敗、通話異常を表示isOnCalling = false;}}// リモートビデオストリームをプル@Overridepublic void onUserVideoAvailable(String userId, boolean available) {// リモートユーザーがメインビデオ画面をパブリッシュ/キャンセルif (available) {// リモートユーザーのビデオストリームを購読し、ビデオレンダリングコントロールにバインドmTRTCCloud.startRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, view);} else {// リモートユーザーのビデオストリームの購読を停止し、レンダリングコントロールをリリースmTRTCCloud.stopRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG);}}
private void rejectInvite(String inviteId, String data, final V2TIMCallback callback) { V2TIMManager.getSignalingManager().reject(inviteId, data, new V2TIMCallback() { @Override public void onError(int code, String desc) { if (callback != null) { callback.onError(code, desc); } } @Override public void onSuccess() { if (callback != null) { callback.onSuccess(); } } }); }JSONObject jsonObject = new JSONObject();try {jsonObject.put("cmd", "av_call");JSONObject msgJsonObject = new JSONObject();msgJsonObject.put("callType", "videoCall"); // 通話タイプ(ビデオ通話、ボイス通話)を指定msgJsonObject.put("reason", "active"); // 拒否タイプを指定(アクティブ拒否、ビジー拒否)jsonObject.put("msg", msgJsonObject);} catch (JSONException e) {e.printStackTrace();}rejectInvite(inviteId, jsonObject.toString(), new V2TIMCallback() { @Override public void onError(int code, String desc) { // 拒否に失敗、「例外が発生しました」、「再試行してください」が表示されます。 } @Override public void onSuccess() { // 拒否に成功、発信ページが破棄され、着信音の再生をが停止します。 } });
@Override public void onInviteeRejected(String inviteID, String invitee, String data) {if (!data.isEmpty()) {try {JSONObject jsonObject = new JSONObject(data);String command = jsonObject.getString("cmd");JSONObject messageJsonObject = jsonObject.getJSONObject("msg");if (command.equals("av_call")) {String reason = messageJsonObject.getString("reason");if (reason.equals("active")) {// 相手が拒否したと表示} else if (reason.equals("busy")) {// 相手がビジー状態であると表示}// 発信ページが破棄され、呼び出し音の再生が停止します}} catch (JSONException e) {e.printStackTrace();}}}
@Overridepublic void onReceiveNewInvitation(String inviteID, String inviter,String groupId, List<String> inviteeList, String data) {if (!data.isEmpty()) {try {JSONObject jsonObject = new JSONObject(data);String command = jsonObject.getString("cmd");JSONObject messageJsonObject = jsonObject.getJSONObject("msg");if (command.equals("av_call") && isOnCalling) {JSONObject jsonObject = new JSONObject();try {jsonObject.put("cmd", "av_call");JSONObject msgJsonObject = new JSONObject();msgJsonObject.put("callType", "videoCall"); // 通話タイプ(ビデオ通話、ボイス通話)を指定msgJsonObject.put("reason", "busy"); // 拒否タイプを指定(アクティブ拒否、ビジー拒否)jsonObject.put("msg", msgJsonObject);} catch (JSONException e) {e.printStackTrace();}// ローカル通話中、ビジー拒否シグナルを送信rejectInvite(inviteId, jsonObject.toString(), new V2TIMCallback() {@Overridepublic void onError(int code, String desc) {// ビジー拒否に失敗}@Overridepublic void onSuccess() {// ビジー拒否に成功}});}} catch (JSONException e) {e.printStackTrace();}}}
private void hangup() {mTRTCCloud.stopLocalAudio();mTRTCCloud.stopLocalPreview();mTRTCCloud.exitRoom();}@Overridepublic void onExitRoom(int reason) {// 部屋から正常に退出し、通話を切断しましたisOnCalling = false;}
@Overridepublic void onRemoteUserLeaveRoom(String userId, int reason) {hangup();}@Overridepublic void onExitRoom(int reason) {// 部屋から正常に退出し、通話を切断しましたisOnCalling = false;}
// マイクをオンにするmTRTCCloud.muteLocalAudio(false);// マイクをオフにするmTRTCCloud.muteLocalAudio(true);
// スピーカーをオンにするmTRTCCloud.muteAllRemoteAudio(false);// スピーカーをオフにするmTRTCCloud.muteAllRemoteAudio(true);
// カメラを開き、イン・アウトカメラとレンダリングコントロールを指定mTRTCCloud.startLocalPreview(isFrontCamera, videoView);// カメラをオフにするmTRTCCloud.stopLocalPreview();
// スピーカーに切り替えるmTRTCCloud.getDeviceManager().setAudioRoute(TXDeviceManager.TXAudioRoute.TXAudioRouteEarpiece);// ハンズフリーに切り替えるmTRTCCloud.getDeviceManager().setAudioRoute(TXDeviceManager.TXAudioRoute.TXAudioRouteSpeakerphone);
// 現在がインカメラかどうかを判断boolean isFrontCamera = mTRTCCloud.getDeviceManager().isFrontCamera();// 前後カメラの切り替え、true: :インカメラに切り替える、; false: :アウトカメラに切り替えるmTRTCCloud.getDeviceManager().switchCamera(!isFrontCamera);
@Overridepublic void onNetworkQuality(TRTCCloudDef.TRTCQuality localQuality, ArrayList<TRTCCloudDef.TRTCQuality> remoteQuality) {if (remoteQuality.size() > 0) {switch (remoteQuality.get(0).quality) {case TRTCCloudDef.TRTC_QUALITY_Excellent:Log.i(TAG, "相手のネットワーク状態がとてもいい");break;case TRTCCloudDef.TRTC_QUALITY_Good:Log.i(TAG, "相手のネットワーク状態が比較的良い");break;case TRTCCloudDef.TRTC_QUALITY_Poor:Log.i(TAG, "相手のネットワーク状態が普通");break;case TRTCCloudDef.TRTC_QUALITY_Bad:Log.i(TAG, "相手のネットワーク状態が不安定");break;case TRTCCloudDef.TRTC_QUALITY_Vbad:Log.i(TAG, "相手のネットワーク状態がかなり悪い");break;case TRTCCloudDef.TRTC_QUALITY_Down:Log.i(TAG, "相手のネットワーク状態が極めて悪い");break;default:Log.i(TAG, "未定義");break;}}}
localQualityはローカルユーザーのネットワーク品質評価結果で、そのuserIdフィールドは空です。remoteQualityはリモートユーザーのネットワーク品質評価結果を表し、その結果はリモートとローカルの両方の影響を受けます。// 通話開始時間long callStartTime = 0;// 通話終了時間long callFinishTime = 0;// 通話の持続時間(秒)long callDuration = 0;// リモートユーザー入室コールバック@Overridepublic void onRemoteUserEnterRoom(String userId) {callStartTime = System.currentTimeMillis();}// ローカルユーザー退室コールバック@Overridepublic void onExitRoom(int reason) {callFinishTime = System.currentTimeMillis();callDuration = (callFinishTime - callStartTime) / 1000;}
XmagicResParser.setResPath(new File(getFilesDir(), "xmagic").getAbsolutePath());//loading//リソースファイルをプライベートディレクトリにcopyする必要がありますが、一度だけ実行必要です。XmagicResParser.copyRes(getApplicationContext());
XmagicResParser.setResPath(ダウンロードしたリソースファイルのローカルパス);
mTRTCCloud.setLocalVideoProcessListener(TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_Texture_2D, TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_TEXTURE, new TRTCCloudListener.TRTCVideoFrameListener() {@Overridepublic void onGLContextCreated() {// SDK内部のOpenGL環境が作成、この時点でサードパーティー顔加工の初期化作業が可能if (mXmagicApi == null) {XmagicApi mXmagicApi = new XmagicApi(context, XmagicResParser.getResPath(), new XmagicApi.OnXmagicPropertyErrorListener());} else {mXmagicApi.onResume();}}@Overridepublic int onProcessVideoFrame(TRTCCloudDef.TRTCVideoFrame srcFrame, TRTCCloudDef.TRTCVideoFrame dstFrame) {// サードパーティー顔加工コンポーネントをアクセスするためのビデオ処理コールバックif (mXmagicApi != null) {dstFrame.texture.textureId = mXmagicApi.process(srcFrame.texture.textureId, srcFrame.width, srcFrame.height);}return 0;}@Overridepublic void onGLContextDestory() {// SDK内部のOpenGL環境が破棄、この時点でサードパーティー顔加工のリソース破棄が可能mXmagicApi.onDestroy();}});
TXCloudVideoViewをビデオレンダリングコントロールとして使用し、SurfaceViewとTextureViewの2つのレンダリング方式をサポートしています。以下、レンダリングコントロールのタイプを指定する方法と、ビデオレンダリングコントロールを更新する方法について説明します。TXCloudVideoViewに変換したい場合は、以下の方法でプログラムを組めます。// TextureViewの強制使用TextureView textureView = findViewById(R.id.texture_view);TXCloudVideoView cloudVideoView = new TXCloudVideoView(context);cloudVideoView.addVideoView(textureView);// SurfaceViewの強制使用SurfaceView surfaceView = findViewById(R.id.surface_view);TXCloudVideoView cloudVideoView = new TXCloudVideoView(surfaceView);
// ローカルプレビュー画面のレンダリングコントロールを更新mTRTCCloud.updateLocalView(videoView);// リモートユーザーのビデオレンダリングコントロールを更新mTRTCCloud.updateRemoteView(userId, streamType, videoView);
videoViewはTXCloudVideoViewタイプのにターゲットビデオレンダリングコントロールです。streamTypeはTRTC_VIDEO_STREAM_TYPE_BIGとTRTC_VIDEO_STREAM_TYPE_SUBのみに対応します。import com.google.gson.Gson;import com.tencent.imsdk.v2.V2TIMCallback;import com.tencent.imsdk.v2.V2TIMManager;import com.tencent.imsdk.v2.V2TIMOfflinePushInfo;import com.tencent.qcloud.tuicore.TUILogin;import com.tencent.qcloud.tuicore.push.OfflinePushExtConfigInfo;import com.tencent.qcloud.tuicore.push.OfflinePushExtInfo;import org.json.JSONException;import org.json.JSONObject;JSONObject contentObj = new JSONObject();try {contentObj.put("cmd", "av_call");JSONObject contentDetailObj = new JSONObject();contentDetailObj.put("callType", "videoCall");contentDetailObj.put("roomId", generateRoomId());contentObj.put("cmdInfo", contentDetailObj);} catch (JSONException e) {e.printStackTrace();}String data = contentObj.toString();OfflinePushExtInfo offlinePushExtInfo = new OfflinePushExtInfo();offlinePushExtInfo.getBusinessInfo().setSenderId(TUILogin.getLoginUser());offlinePushExtInfo.getBusinessInfo().setSenderNickName(mNickname);offlinePushExtInfo.getBusinessInfo().setFaceUrl(mFaceUrl);offlinePushExtInfo.getBusinessInfo().setSendTime(System.currentTimeMillis() / 1000);offlinePushExtInfo.getBusinessInfo().setDesc("You have a new call invitation");offlinePushExtInfo.getBusinessInfo().setChatAction(OfflinePushExtInfo.REDIRECT_ACTION_CALL);offlinePushExtInfo.getBusinessInfo().setCustomData(data.getBytes());offlinePushExtInfo.getConfigInfo().setFCMPushType(OfflinePushExtConfigInfo.FCM_PUSH_TYPE_DATA);offlinePushExtInfo.getConfigInfo().setFCMNotificationType(OfflinePushExtConfigInfo.FCM_NOTIFICATION_TYPE_TIMPUSH);V2TIMOfflinePushInfo v2TIMOfflinePushInfo = new V2TIMOfflinePushInfo();v2TIMOfflinePushInfo.setTitle(mNickname);v2TIMOfflinePushInfo.setDesc("You have a new call invitation");v2TIMOfflinePushInfo.setExt(new Gson().toJson(offlinePushExtInfo).getBytes());v2TIMOfflinePushInfo.setAndroidOPPOChannelID("tuikit");v2TIMOfflinePushInfo.setAndroidHuaWeiCategory("IM");v2TIMOfflinePushInfo.setAndroidVIVOCategory("IM");// カスタム着信音の設定v2TIMOfflinePushInfo.setIOSSound("phone_ringing.mp3");v2TIMOfflinePushInfo.setAndroidSound("phone_ringing");v2TIMOfflinePushInfo.setIOSInterruptionLevel("time-sensitive");v2TIMOfflinePushInfo.enableIOSBackgroundNotification(false);v2TIMOfflinePushInfo.setAndroidHonorImportance("NORMAL");v2TIMOfflinePushInfo.setAndroidMeizuNotifyType(1);V2TIMManager.getSignalingManager().invite(receiver, data, false, v2TIMOfflinePushInfo, timeout, new V2TIMCallback() {@Overridepublic void onError(int code, String desc) {// 通話招待の送信に失敗}@Overridepublic void onSuccess() {// 通話招待の送信に成功}});
private void handleOfflinePush() {// ログイン状態に基づいて、IMに再ログインする必要があるかどうかを判断します。// 1. ログイン状態がV2TIMManager.V2TIM_STATUS_LOGOUTの場合、ログイン画面に移動して、IMに再ログインしますif (V2TIMManager.getInstance().getLoginStatus() == V2TIMManager.V2TIM_STATUS_LOGOUT) {Intent intent = new Intent(MainActivity.this, SplashActivity.class);if (getIntent() != null) {intent.putExtras(getIntent());}startActivity(intent);finish();return;}// 2. そうでない場合、アプリがバックグラウンドで待機しているだけで、オフラインプッシュパラメータを直接解析します。final OfflineMessageBean bean = OfflineMessageDispatcher.parseOfflineMessage(getIntent());if (bean != null) {setIntent(null);NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);if (manager != null) {manager.cancelAll();}if (bean.action == OfflineMessageBean.REDIRECT_ACTION_CALL) {Intent startActivityIntent = new Intent(context, MyCustomActivity.class);startActivityIntent.putExtras(getIntent());startActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(startActivityIntent);}}}
列挙値 | 取得値 | 説明 |
ERR_TRTC_INVALID_USER_SIG | -3320 | 入室パラメータUserSigが正しくありません。 TRTCParams.userSigが空であるかどうかを確認してください。 |
ERR_TRTC_USER_SIG_CHECK_FAILED | -100018 | UserSig検証失敗、パラメータ TRTCParams.userSigが正しく入力されているか、または期限切れでないかを確認してください。 |
列挙値 | 取得値 | 説明 |
ERR_TRTC_CONNECT_SERVER_TIMEOUT | -3308 | 入室リクエストがタイムアウトしました。ネットワークが切断されているか、VPNが使用されているかを確認してください。また、4Gに切り替えてテストすることもできます。 |
ERR_TRTC_INVALID_SDK_APPID | -3317 | 入室パラメータSDKAppIDエラー。 TRTCParams.sdkAppIdが空であるかどうか確認してください。 |
ERR_TRTC_INVALID_ROOM_ID | -3318 | 入室パラメータroomIdエラー。 TRTCParams.roomIdまたはTRTCParams.strRoomIdが空であるかどうか確認してください。roomIdとstrRoomIdは混在できません。 |
ERR_TRTC_INVALID_USER_ID | -3319 | 入室パラメータuserIdが正しくありません。 TRTCParams.userIdが空であるかどうかを確認してください。 |
ERR_TRTC_ENTER_ROOM_REFUSED | -3340 | 入室リクエストが拒否されました。 enterRoomで同じIdのルームに連続して入室しようとしていないか確認してください。 |
列挙値 | 取得値 | 説明 |
ERR_CAMERA_START_FAIL | -1301 | カメラの起動に失敗しました。例えば、WindowsまたはMacデバイスで、カメラの設定プログラム(ドライバー)に異常があります。デバイスを無効にしてから再度有効にするか、マシンを再起動するか、または設定プログラムを更新してください。 |
ERR_MIC_START_FAIL | -1302 | マイクの起動に失敗しました。例えば、WindowsまたはMacデバイスで、マイクの設定プログラム(ドライバー)に異常があります。デバイスを無効にしてから再度有効にするか、マシンを再起動するか、設定プログラムを更新してください。 |
ERR_CAMERA_NOT_AUTHORIZED | -1314 | カメラが許可されていません。これは通常、モバイルデバイスで発生し、ユーザーによって権限が拒否された可能性があります。 |
ERR_MIC_NOT_AUTHORIZED | -1317 | マイクが許可されていません。これは通常、モバイルデバイスで発生し、ユーザーによって権限が拒否された可能性があります。 |
ERR_CAMERA_OCCUPY | -1316 | カメラが使用中です。他のカメラを試してみてください。 |
ERR_MIC_OCCUPY | -1319 | マイクが使用中です。たとえば、モバイルデバイスが通話中の場合、マイクを開くと失敗します。 |
フィードバック