1. 程式人生 > >AnyChatSDK 實現視訊通話

AnyChatSDK 實現視訊通話

複製程式碼
package com.bairuitech.main;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.DisplayMetrics;
import android.util.Log; import android.view.inputmethod.InputMethodManager; import com.bairuitech.anychat.AnyChatBaseEvent; import com.bairuitech.anychat.AnyChatCoreSDK; import com.bairuitech.anychat.AnyChatDefine; import com.bairuitech.anychat.AnyChatObjectDefine; import com.bairuitech.anychat.AnyChatObjectEvent;
import com.bairuitech.anychat.AnyChatVideoCallEvent; import com.bairuitech.common.ConfigEntity; import com.bairuitech.common.ConfigService; import com.bairuitech.common.DialogFactory; import com.bairuitech.common.ScreenInfo; public class AnyChat_Login implements AnyChatBaseEvent, AnyChatObjectEvent, AnyChatVideoCallEvent {
// private static final String mStrIP = "demo.anychat.cn"; private static final String mStrIP = "**.*.*.***"; //伺服器地址 private static final int mSPort = ****; //埠號 private static final String TAG = "AnyChat_Login"; private String mStrName = "Tom"; private String passWord; private List<Integer> mobject = new ArrayList<Integer>(); // 裝載營業廳ID private int[] queueIds; private int USER_TYPE_ID; // 0代表是進入客戶介面,2代表是接入座席介面 public AnyChatCoreSDK anyChatSDK; private AnyChat_LoginCallBack loginCallback; private AnyChat_GetFunRoomCallBack roomCallBack; private AnyChat_UpdateQueueInfoCallBack updateCallBack; private AnyChat_VideoResultCallBack videoCallBack; private Activity context; private QueueInfoEntity entity; private long time; /** * 使用者當前狀態 * * @author Administrator * */ public enum LoginStatus { Success, Waiting, Failure, Finish, NoNet, UnKnownErr, Reconnection } /** * * @param context * 上下文環境 * @param termId * 終端號 (使用者名稱) * @param applyId * 業務ID(Password) */ public AnyChat_Login(Activity context, String termId, String applyId) { this.context = context; this.mStrName = termId; this.passWord = applyId; entity = QueueInfoEntity.getQueueInfoEntity(); setDisPlayMetrics(); ApplyVideoConfig(); InitSDK(); } public void setAnyChat_LoginCallBack(AnyChat_LoginCallBack callback) { this.loginCallback = callback; } public void setAnyChat_GetFunRoom(AnyChat_GetFunRoomCallBack callback) { this.roomCallBack = callback; } public void setUpdateCallBack(AnyChat_UpdateQueueInfoCallBack updateCallBack) { this.updateCallBack = updateCallBack; } public void setVideoCallBack(AnyChat_VideoResultCallBack videoCallBack) { this.videoCallBack = videoCallBack; } // 初始化SDK private void InitSDK() { if (anyChatSDK == null) { anyChatSDK = AnyChatCoreSDK.getInstance(context); } anyChatSDK.SetBaseEvent(this);// 基本事件 anyChatSDK.SetObjectEvent(this);// 營業廳排隊事件 anyChatSDK.SetVideoCallEvent(this); anyChatSDK.InitSDK(android.os.Build.VERSION.SDK_INT, 0);// 初始化sdk AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_AUTOROTATION, 1); } public void loginAnyChat() { loginCallback.getLoginStatus(LoginStatus.Waiting, -1); anyChatSDK.Connect(mStrIP, mSPort); // 註冊廣播 registerBoradcastReceiver(); } // 對鍵盤顯示進行控制 private void hideKeyboard() { InputMethodManager imm = (InputMethodManager) context .getSystemService(Context.INPUT_METHOD_SERVICE); if (imm.isActive()) { imm.hideSoftInputFromWindow(context.getCurrentFocus() .getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } /** * 螢幕大小 */ private void setDisPlayMetrics() { DisplayMetrics dMetrics = new DisplayMetrics(); context.getWindowManager().getDefaultDisplay().getMetrics(dMetrics); ScreenInfo.WIDTH = dMetrics.widthPixels; ScreenInfo.HEIGHT = dMetrics.heightPixels; } public void onDestroy() { anyChatSDK.LeaveRoom(-1); anyChatSDK.Logout(); anyChatSDK.Release(); context.unregisterReceiver(mBroadcastReceiver); } public void onRestart() { anyChatSDK.SetBaseEvent(this); anyChatSDK.SetObjectEvent(this); } @Override public void OnAnyChatConnectMessage(boolean bSuccess) { if (!bSuccess) { Log.e(TAG, "連線伺服器失敗,自動重連,請稍後..."); loginCallback.getLoginStatus(LoginStatus.Reconnection, -1); } anyChatSDK.Login(mStrName, passWord); } @Override public void OnAnyChatLoginMessage(int dwUserId, int dwErrorCode) { // 連線成功 if (dwErrorCode == 0) { // hideKeyboard(); // 儲存使用者id和使用者角色資訊 entity.selfUserName = mStrName; entity.mUserID = dwUserId; entity.userType = USER_TYPE_ID; Log.e(TAG, "Connect to the server success"); // 初始化業務物件屬性身份 InitClientObjectInfo(dwUserId); loginCallback.getLoginStatus(LoginStatus.Success, dwUserId); } else { Log.e(TAG, "登入失敗,errorCode:" + dwErrorCode); loginCallback.getLoginStatus(LoginStatus.Failure, -1); } } // 初始化服務物件事件;觸發回撥OnAnyChatObjectEvent函式 private void InitClientObjectInfo(int dwUserId) { // 業務物件身份初始化;0代表普通客戶,2是代表座席 (USER_TYPE_ID) AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_OBJECT_INITFLAGS, USER_TYPE_ID); // 業務物件優先順序設定; int dwPriority = 10; AnyChatCoreSDK.ObjectSetIntValue( AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_CLIENTUSER, dwUserId, AnyChatObjectDefine.ANYCHAT_OBJECT_INFO_PRIORITY, dwPriority); // 業務物件屬性設定,必須是-1; int dwAttribute = -1; AnyChatCoreSDK.ObjectSetIntValue( AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_CLIENTUSER, dwUserId, AnyChatObjectDefine.ANYCHAT_OBJECT_INFO_ATTRIBUTE, dwAttribute); // 向伺服器傳送資料同步請求指令 AnyChatCoreSDK.ObjectControl( AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_AREA, AnyChatObjectDefine.ANYCHAT_INVALID_OBJECT_ID, AnyChatObjectDefine.ANYCHAT_OBJECT_CTRL_SYNCDATA, dwUserId, 0, 0, 0, ""); } @Override public void OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode) { } @Override public void OnAnyChatOnlineUserMessage(int dwUserNum, int dwRoomId) { } @Override public void OnAnyChatUserAtRoomMessage(int dwUserId, boolean bEnter) { } // 網路埠 @Override public void OnAnyChatLinkCloseMessage(int dwErrorCode) { anyChatSDK.LeaveRoom(-1); anyChatSDK.Logout(); Log.e(TAG, "連線關閉,errorCode:" + dwErrorCode); loginCallback.getLoginStatus(LoginStatus.UnKnownErr, -1); } // 廣播 private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals("NetworkDiscon")) { anyChatSDK.LeaveRoom(-1); anyChatSDK.Logout(); loginCallback.getLoginStatus(LoginStatus.NoNet, -1); } } }; private void registerBoradcastReceiver() { IntentFilter myIntentFilter = new IntentFilter(); myIntentFilter.addAction("NetworkDiscon"); // 註冊廣播 context.registerReceiver(mBroadcastReceiver, myIntentFilter); } @Override public void OnAnyChatObjectEvent(int dwObjectType, int dwObjectId, int dwEventType, int dwParam1, int dwParam2, int dwParam3, int dwParam4, String strParam) { Log.e("OnAnyChatObjectEvent", "----------------"); switch (dwEventType) { // 營業廳資料同步,回撥一次返回一個營業廳物件id(有多少營業廳回撥多少次) case AnyChatObjectDefine.ANYCHAT_OBJECT_EVENT_UPDATE: // 裝入集合 mobject.add(dwObjectId); break; // 進入營業廳結果回撥 case AnyChatObjectDefine.ANYCHAT_AREA_EVENT_ENTERRESULT: AnyChatEnterAreaResult(dwObjectType, dwObjectId, dwParam1); break; case AnyChatObjectDefine.ANYCHAT_AREA_EVENT_LEAVERESULT: Log.e(TAG, "退出營業廳"); context.finish(); break; // 資料同步完成回撥 case AnyChatObjectDefine.ANYCHAT_OBJECT_EVENT_SYNCDATAFINISH: DataFinshed(dwObjectType); break; case AnyChatObjectDefine.ANYCHAT_QUEUE_EVENT_ENTERRESULT: break; case AnyChatObjectDefine.ANYCHAT_QUEUE_EVENT_STATUSCHANGE: updateCallBack.onUpdateQueueInfo(dwObjectId); break; } } // 進入營業廳的回撥,跳轉到業務列表 private void AnyChatEnterAreaResult(int dwObjectType, int dwObjectId, int dwParam1) { // dwParam1 進入營業廳返回結果,0表示進入營業廳成功 Log.e(TAG, "TAG:" + "dwObjectType:" + dwObjectType + ";dwObjectId:" + dwObjectId + ";dwParam1:" + dwParam1); // 客戶角色 if (entity.userType == 0) { startDeal(); // 座席角色 } } private void DataFinshed(int dwObjectType) { Log.e("TAG", "dwObjectType:" + dwObjectType); if (dwObjectType == AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_AREA) { // 介面卡的資料獲取 List<String> list = new ArrayList<String>(); for (int index = 0; index < mobject.size(); index++) { String name = AnyChatCoreSDK.ObjectGetStringValue( AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_AREA, mobject.get(index), AnyChatObjectDefine.ANYCHAT_OBJECT_INFO_NAME); list.add(name); Log.e("TAG", "TAG:" + index + "; name:" + name); } roomCallBack.getAnyChat_GetFunRoom(mobject); } } /** * 根據配置檔案配置視訊引數 */ private void ApplyVideoConfig() { ConfigEntity configEntity = ConfigService.LoadConfig(context); if (configEntity.configMode == 1) // 自定義視訊引數配置 { // 設定本地視訊編碼的位元速率(如果位元速率為0,則表示使用質量優先模式) AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_BITRATECTRL, configEntity.videoBitrate); if (configEntity.videoBitrate == 0) { // 設定本地視訊編碼的質量 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_QUALITYCTRL, configEntity.videoQuality); } // 設定本地視訊編碼的幀率 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_FPSCTRL, configEntity.videoFps); // 設定本地視訊編碼的關鍵幀間隔 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_GOPCTRL, configEntity.videoFps * 4); // 設定本地視訊採集解析度 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_WIDTHCTRL, configEntity.resolution_width); AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_HEIGHTCTRL, configEntity.resolution_height); // 設定視訊編碼預設引數(值越大,編碼質量越高,佔用CPU資源也會越高) AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_PRESETCTRL, configEntity.videoPreset); } // 讓視訊引數生效 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_APPLYPARAM, configEntity.configMode); // P2P設定 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_NETWORK_P2PPOLITIC, configEntity.enableP2P); // 本地視訊Overlay模式設定 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_OVERLAY, configEntity.videoOverlay); // 迴音消除設定 AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_AUDIO_ECHOCTRL, configEntity.enableAEC); // 平臺硬體編碼設定 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_CORESDK_USEHWCODEC, configEntity.useHWCodec); // 視訊旋轉模式設定 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_ROTATECTRL, configEntity.videorotatemode); // 本地視訊採集偏色修正設定 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_FIXCOLORDEVIA, configEntity.fixcolordeviation); // 視訊GPU渲染設定 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_VIDEOSHOW_GPUDIRECTRENDER, configEntity.videoShowGPURender); // 本地視訊自動旋轉設定 AnyChatCoreSDK.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_AUTOROTATION, configEntity.videoAutoRotation); } @Override public void OnAnyChatVideoCallEvent(int dwEventType, int dwUserId, int dwErrorCode, int dwFlags, int dwParam, String userStr) { Log.e("OnAnyChatVideoCallEvent", "dwEventType:" + dwEventType + ";dwErrorCode:" + dwErrorCode); switch (dwEventType) { case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST: // 呼叫請求事件 BussinessCenter.getBussinessCenter().onVideoCallRequest(dwUserId, dwFlags, dwParam, userStr); entity.targetUserName = anyChatSDK.GetUserName(dwUserId); Dialog dialog = DialogFactory.getDialog(DialogFactory.DIALOGID_REQUEST, dwUserId, context,entity); dialog.show(); break; case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY: // 呼叫成功的時候的所做出的反應; Log.e("queueactivity", "呼叫成功等待對方反應的回撥"); BussinessCenter.getBussinessCenter().onVideoCallReply(dwUserId, dwErrorCode, dwFlags, dwParam, userStr, videoCallBack); if (dwErrorCode == AnyChatDefine.BRAC_ERRORCODE_SUCCESS) { } else { } break; case AnyChatDefine.BRAC_VIDEOCALL_EVENT_START: Log.e("queueactivity", "會話開始回撥"); entity.TargetUserId = dwUserId; entity.RoomId = dwParam; BussinessCenter.getBussinessCenter().stopSessionMusic(); videoCallBack.onAnyChat_VieoResult(dwUserId); break; } } /** * 使用者當前狀態 * * @author Administrator * */ public interface AnyChat_LoginCallBack { public void getLoginStatus(LoginStatus status, int dwUserId); } /** * 返回營業廳ID * * @author Administrator * */ public interface AnyChat_GetFunRoomCallBack { public void getAnyChat_GetFunRoom(List<Integer> list); } /** * 立即辦理 */ public void startDeal() { queueIds = AnyChatCoreSDK .ObjectGetIdList(AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_QUEUE); for (int i = 0; i < queueIds.length; i++) { String name = AnyChatCoreSDK.ObjectGetStringValue( AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_QUEUE, queueIds[i], AnyChatObjectDefine.ANYCHAT_OBJECT_INFO_NAME); int number = AnyChatCoreSDK.ObjectGetIntValue( AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_QUEUE, queueIds[i], AnyChatObjectDefine.ANYCHAT_QUEUE_INFO_LENGTH); Log.e("TAG", "業務字元名稱:" + name + ";業務排隊人數:" + number); } if (queueIds != null && queueIds.length != 0) { entity.CurrentQueueId = (queueIds[0]); // 進入佇列的控制指令 AnyChatCoreSDK.ObjectControl( AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_QUEUE, queueIds[0], AnyChatObjectDefine.ANYCHAT_QUEUE_CTRL_USERENTER, 0, 0, 0, 0, ""); } else { entity.CurrentQueueId = 0; // 進入佇列的控制指令 AnyChatCoreSDK.ObjectControl( AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_QUEUE, 0, AnyChatObjectDefine.ANYCHAT_QUEUE_CTRL_USERENTER, 0, 0, 0, 0, ""); } } public interface AnyChat_UpdateQueueInfoCallBack { public void onUpdateQueueInfo(int dwObjectId); } public interface AnyChat_VideoResultCallBack { public void onAnyChat_VieoResult(int obj); } }
複製程式碼