AnyChatSDK 實現視頻通話


公司的項目需要添加視頻通話功能,公司選擇使用AnyChatSDK來實現;

①下載:

  地址:http://www.anychat.cn/download.html;

  這里官方提供了完成的Demo和開發文檔可以下載

②我們目前采用的是消息隊列,我重點介紹這一部分

 

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);
    }
}

 這段代碼是將官方Demo中的登陸和排隊部分放到一塊,調用之后可以直接實現登陸、排隊功能

 AnyChatBaseEvent接口:這個接口是AnyChat最重要的接口,用戶登陸、退出、房間所在人數都是有這個接口來控制;

 AnyChatObjectEvent接口:這個接口是用來接收客服對象的接口;

 OnAnyChatVideoCallEvent接口:這個接口是接收呼叫信息的接口,AnyChat_VideoResultCallBack是我自定義的接口來處理后台服務器發送的服務請求

 這部分變動需要將BussinessCenter類中的參數做些改動,當相對較小,待會再后面貼上源碼

 ③下面是在Activity中的調用:

package com.bankeys.shield.activity;

import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import com.bairuitech.anychat.AnyChatCoreSDK;
import com.bairuitech.anychat.AnyChatObjectDefine;
import com.bairuitech.common.BaseMethod;
import com.bairuitech.main.AnyChat_Login;
import com.bairuitech.main.AnyChat_Login.AnyChat_GetFunRoomCallBack;
import com.bairuitech.main.AnyChat_Login.AnyChat_LoginCallBack;
import com.bairuitech.main.AnyChat_Login.AnyChat_UpdateQueueInfoCallBack;
import com.bairuitech.main.AnyChat_Login.AnyChat_VideoResultCallBack;
import com.bairuitech.main.AnyChat_Login.LoginStatus;
import com.bairuitech.main.BussinessCenter;
import com.bairuitech.main.QueueInfoEntity;
import com.bankeys.base.ShieldBaseActivity;
import com.bankeys.shield.R;
import com.bankeys.shield.util.BksUtils;
import com.bankeys.shield.view.AlerDialogTools;
import com.bankeys.util.LogUtil;

public class VideoQueueActivity extends ShieldBaseActivity {
    private Button quickButton;
    private TextView showTextView;
    private TextView timeshow;
    private final int TIME_UPDATE = 291; // Handler發送消息,隊列人數的實時更新
    private AnyChat_Login login;
    private int USER_TYPE_ID; // 0代表是進入客戶界面,2代表是接入座席界面
    private QueueInfoEntity entity;
    private Dialog mDialog;
    private String appCode;
    private String applyId;

    @Override
    protected int getLayoutId() {
        return R.layout.activity_queue;
    }

    @Override
    protected void initLayout() {
        entity = QueueInfoEntity.getQueueInfoEntity();
        appCode = getIntent().getStringExtra(BksUtils.APPCODE);
        applyId = getIntent().getStringExtra(BksUtils.APPLYID);
        startLogin();
        initView();
    }

    @Override
    protected CharSequence setTitle() {
        return getResources().getString(R.string.remote_attestation);
    }

    private void initView() {
        int length = AnyChatCoreSDK.ObjectGetIntValue(AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_QUEUE,
                entity.CurrentQueueId, AnyChatObjectDefine.ANYCHAT_QUEUE_INFO_LENGTH);
        // 排在自己前面的人數
        int morder = AnyChatCoreSDK.ObjectGetIntValue(AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_QUEUE,
                entity.CurrentQueueId, AnyChatObjectDefine.ANYCHAT_QUEUE_INFO_BEFOREUSERNUM);
        showTextView = (TextView) findViewById(R.id.queue_show);
        showTextView.setText("當前排隊人數共:" + length  + "人,您現在排在第 " + (morder + 1) + " 位");
        LogUtil.debug("");
        // 實時更新顯示時間
        timeshow = (TextView) findViewById(R.id.queue_time);
        final Handler myhHandler = new Handler(new Handler.Callback() {
            
            @Override
            public boolean handleMessage(Message msg) {
                if (msg.what == TIME_UPDATE) {
                    int seconds = AnyChatCoreSDK.ObjectGetIntValue(
                            AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_QUEUE,
                            entity.CurrentQueueId,
                            AnyChatObjectDefine.ANYCHAT_QUEUE_INFO_WAITTIMESECOND);
                    timeshow.setText("您已等待了 " + BaseMethod.getTimeShowStringTwo(seconds));
                }
                return false;
            }
        });
        new Timer().schedule(new TimerTask() {

            @Override
            public void run() {
                myhHandler.sendEmptyMessage(TIME_UPDATE);
            }
        }, 0, 1000);

        quickButton = (Button) findViewById(R.id.queue_btn);
        quickButton.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                alertDialog();
            }
        });

    }

    private void startLogin() {
        login = new AnyChat_Login(this, BksUtils.getTermId(this), applyId);
        login.setAnyChat_LoginCallBack(new AnyChat_LoginCallBack() {

            @Override
            public void getLoginStatus(LoginStatus status, int dwUserId) {
                switch (status) {
                case Reconnection:
                case Waiting:
                    mDialog = AlerDialogTools.showWaitingDialog(VideoQueueActivity.this,
                            "正在登陸,請稍候", false);
                    mDialog.show();
                    break;
                case Success:
                    entity.userType = USER_TYPE_ID;
                    if (mDialog != null && mDialog.isShowing()) {
                        mDialog.dismiss();
                    }
                    break;
                case NoNet:
                default:
                    if (mDialog != null && mDialog.isShowing()) {
                        mDialog.dismiss();
                    }
                    break;
                }
            }
        });
        login.setAnyChat_GetFunRoom(new AnyChat_GetFunRoomCallBack() {

            @Override
            public void getAnyChat_GetFunRoom(List<Integer> list) {
                AnyChatCoreSDK.ObjectControl(AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_AREA, list.get(0),
                        AnyChatObjectDefine.ANYCHAT_AREA_CTRL_USERENTER, 0, 0, 0, 0, "");
                String termId = BksUtils.getTermId(VideoQueueActivity.this);
                try {
                    String s = termId.substring(termId.length() - 1,termId.length());
                    int ox = Integer.parseInt(s);
                    if(list.size() > 1){
                            entity.CurrentAreaId = list.get(ox / 2);
                    }else{
                        entity.CurrentAreaId = list.get(0); //營業廳ID
                    }
                } catch (Exception e) {
                    entity.CurrentAreaId = list.get(0); //營業廳ID
                }
                
            }
        });
        login.setUpdateCallBack(new AnyChat_UpdateQueueInfoCallBack() {

            @Override
            public void onUpdateQueueInfo(int dwObjectId) {
                dataChange(dwObjectId);
            }
        });
        login.setVideoCallBack(new AnyChat_VideoResultCallBack() {

            @Override
            public void onAnyChat_VieoResult(final int dwUserId) {
                Intent intent = new Intent(VideoQueueActivity.this, VideoCallActivity.class);
                intent.putExtra(BksUtils.APPLYID, applyId);
                intent.putExtra(BksUtils.APPCODE, appCode);
                startActivityForResult(intent, 0);
            }
        });
        login.loginAnyChat();
    }

    private void alertDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(VideoQueueActivity.this);
        builder.setMessage("您確定要退出當前排隊嗎?").setPositiveButton("確定", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                AnyChatCoreSDK.ObjectControl(AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_QUEUE,
                        entity.CurrentQueueId,
                        AnyChatObjectDefine.ANYCHAT_QUEUE_CTRL_USERLEAVE, 0, 0, 0, 0, "");
                finish();
            }
        }).setNegativeButton("取消", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {

            }
        }).create().show();
    }

    private void dataChange(int dwObjectId) {

        if (dwObjectId == entity.CurrentQueueId) {

            int length = AnyChatCoreSDK.ObjectGetIntValue(AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_QUEUE,
                    dwObjectId, AnyChatObjectDefine.ANYCHAT_QUEUE_INFO_LENGTH);
            int mbefore = AnyChatCoreSDK.ObjectGetIntValue(AnyChatObjectDefine.ANYCHAT_OBJECT_TYPE_QUEUE,
                    dwObjectId, AnyChatObjectDefine.ANYCHAT_QUEUE_INFO_BEFOREUSERNUM);
            showTextView.setText("當前排隊人數共:" + length + "人,您現在排在第 " + (mbefore + 1) + " 位");
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        login.onDestroy();
        BussinessCenter.getBussinessCenter().realse();
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        login.onRestart();
    }
    
    @Override
    protected void onActivityResult(int arg0, int arg1, Intent arg2) {
        // TODO Auto-generated method stub
        super.onActivityResult(arg0, arg1, arg2);
        if(arg1 == RESULT_OK){
            finish();
        }
    }
    
    @Override
    protected void onResume() {
        BussinessCenter.mContext = VideoQueueActivity.this;
        super.onResume();
    }
    
}

  Activity調用可以根據具體場景做相應的調整,在此就不多說了。

④視頻界面參考官方Demo,我只是稍加變動而已,就不在這里一一展示,如果需要項目源碼可以給我留郵箱。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM