初始化及登陸過程分由以下四步組成:
(1) 初始化SDK
(2) 設(shè)置登錄參數(shù)
(3) 設(shè)置通知回調(diào)監(jiān)聽
(4) 驗(yàn)證參數(shù)是否正確,登陸SDK
特別提醒:設(shè)置登錄參數(shù)、通知回調(diào)監(jiān)聽和驗(yàn)證參數(shù)是否正確,登陸SDK,需要在SDK初始化成功的方法(onInitialized回調(diào))后執(zhí)行。
初始化SDK 是調(diào)用其他功能(IM,實(shí)時(shí)音視頻,音視頻會(huì)議等)的前提,如果初始化不成功,后續(xù)的接口都無法調(diào)用。
初始化示例代碼如下:
//判斷SDK是否已經(jīng)初始化 if(!ECDevice.isInitialized()) { /* initial: ECSDK 初始化接口 * 參數(shù): * inContext - Android應(yīng)用上下文對(duì)象 * inListener - SDK初始化結(jié)果回調(diào)接口,ECDevice.InitListener * * 說明:示例在應(yīng)用程序創(chuàng)建時(shí)初始化 SDK引用的是Application的上下文, * 開發(fā)者可根據(jù)開發(fā)需要調(diào)整。 */ ECDevice.initial(getApplicationContext(), new ECDevice.InitListener() { @Override public void onInitialized() { // SDK已經(jīng)初始化成功 Log.i("","初始化SDK成功"); //設(shè)置登錄參數(shù),可分為自定義方式和VoIP驗(yàn)密方式,詳情點(diǎn)此查看>> //設(shè)置通知回調(diào)監(jiān)聽包含登錄狀態(tài)監(jiān)聽,接收消息監(jiān)聽,VoIP呼叫事件回調(diào)監(jiān)聽和 //設(shè)置接收VoIP來電事件通知Intent等,詳情點(diǎn)此查看>> //驗(yàn)證參數(shù)是否正確,登陸SDK,詳情點(diǎn)此查看>> } @Override public void onError(Exception exception) { //在初始化錯(cuò)誤的方法中打印錯(cuò)誤原因 Log.i("","初始化SDK失敗"+exception.getMessage()); } }); } // 已經(jīng)初始化成功,后續(xù)開發(fā)業(yè)務(wù)代碼。 Log.i(TAG, "初始化SDK及登陸代碼完成");
注意事項(xiàng):
(1)初始化不要在application的onCreate方法中進(jìn)行調(diào)用,因?yàn)槿绻鸻ndroid的application沒有創(chuàng)建完成時(shí)執(zhí)行初始化方法,將會(huì)導(dǎo)致初始化無效,在后續(xù)的登錄和其他接口的調(diào)用中出現(xiàn)問題。
(2)如果調(diào)用初始化觸發(fā)初始化失敗onError回調(diào)。可能是由下列原因造成:
a、可能SDK已經(jīng)處于初始化狀態(tài)(未做ECDevice.isInitialized判斷時(shí)出現(xiàn))
b、SDK所聲明必要的權(quán)限未在清單文件(AndroidManifest.xml)里配置、或者未配置服務(wù)屬性android:exported="false";
c、當(dāng)前手機(jī)設(shè)備系統(tǒng)版本低于SDK所支持的最低版本(當(dāng)前SDK支持Android Build.VERSION_CODES.FROYO 以及以上版本)
初始化成功之后我們就可以進(jìn)行登錄。登錄有兩種模式,我們選擇其中一種登錄方式即可:
(1)任意帳號(hào)體系(即自定義登錄方式)
(2)VoIP帳號(hào)體系(即VoIP驗(yàn)密登錄方式)
注:推薦使用(1)自定義登錄方式。因?yàn)榇朔绞较略仆ㄓ嵠脚_(tái)不驗(yàn)證用戶的登錄密碼,只進(jìn)行應(yīng)用級(jí)的驗(yàn)證。提高客戶帳號(hào)創(chuàng)建的自由度和使用的便捷性。
示例代碼如下:
1)任意帳號(hào)體系(即自定義登錄方式)
ECInitParams params = ECInitParams.createParams(); params.setUserid("推薦使用客戶項(xiàng)目APP的登錄帳號(hào),測(cè)試階段Userid可以填寫手機(jī)號(hào)"); params.setAppKey("應(yīng)用ID;登陸官網(wǎng)查看控制臺(tái)→應(yīng)用列表→應(yīng)用管理→APP ID"); params.setToken("應(yīng)用Token;登陸官網(wǎng)查看控制臺(tái)→應(yīng)用列表→應(yīng)用管理→APP TOKEN "); //設(shè)置登陸驗(yàn)證模式:自定義登錄方式 params.setAuthType(ECInitParams.LoginAuthType.NORMAL_AUTH); //LoginMode(強(qiáng)制上線:FORCE_LOGIN 默認(rèn)登錄:AUTO。使用方式詳見注意事項(xiàng)) params.setMode(ECInitParams.LoginMode.FORCE_LOGIN);
2)固定VoIP帳號(hào)體系(即VoIP驗(yàn)密登錄方式)
ECInitParams params = ECInitParams.createParams(); params.setUserid("VoIP帳號(hào);通過創(chuàng)建子帳戶接口獲得"); params.setPwd("VoIP密碼;通過創(chuàng)建子帳戶接口獲得"); params.setAppKey("應(yīng)用ID;登陸官網(wǎng)查看控制臺(tái)→應(yīng)用列表→應(yīng)用管理→APP ID "); //設(shè)置登陸驗(yàn)證模式:VoIP驗(yàn)密登錄方式 params.setAuthType(ECInitParams.LoginAuthType.PASSWORD_AUTH); //LoginMode(強(qiáng)制上線:FORCE_LOGIN 默認(rèn)登錄:AUTO) params.setMode(ECInitParams.LoginMode.FORCE_LOGIN);
注意事項(xiàng):
(1)相同終端之間不可以登錄同一賬號(hào),移動(dòng)設(shè)備之間不可以登錄同一賬號(hào)。移動(dòng)設(shè)備、平板、電腦設(shè)備、Web、PC之間可以登錄相同賬號(hào)。
(2)自定義方式(NORMAL_AUTH)登錄時(shí)候時(shí)Userid不可填VoIP帳號(hào),否則會(huì)導(dǎo)致VoIP密碼失效。
(3)兩種登錄模式的使用:
a、FORCE_LOGIN :強(qiáng)制登錄,可以強(qiáng)制上線,踢掉已經(jīng)在線的同終端設(shè)備。
b、AUTO:自動(dòng)重連
建議在首次登陸時(shí)使用FORCE_LOGIN強(qiáng)制上線登錄模式,之后再次啟動(dòng)APP時(shí)使用AUTO自動(dòng)重連模式。
(4)SDK三種情況后會(huì)自動(dòng)重連
a、登錄方式為FORCE_LOGIN類型并且登陸成功
b、客戶端使用AUTO登錄方式并登陸成功
c、手機(jī)網(wǎng)絡(luò)狀態(tài)改變
(5)自定義登錄方式和VoIP驗(yàn)密登錄方式在開發(fā)者正式項(xiàng)目中只可選用一種。
登錄參數(shù)設(shè)置完成后,開發(fā)者可根據(jù)業(yè)務(wù)需要設(shè)置回調(diào)監(jiān)聽。如下表所示:
監(jiān)聽 |
說明 |
約束 |
---|---|---|
OnECDeviceConnectListener |
登錄回調(diào)監(jiān)聽 |
必須設(shè)置 |
OnChatReceiveListener |
IM接收消息監(jiān)聽 |
使用IM功能時(shí)設(shè)置 |
OnVoIPListener |
VoIP通話狀態(tài)監(jiān)聽 |
使用VoIP功能時(shí)設(shè)置 |
OnMeetingListener |
音視頻會(huì)議回調(diào)監(jiān)聽 |
使用音視頻會(huì)議時(shí)設(shè)置 |
說明:
(1)登錄回調(diào)監(jiān)聽將SDK登錄狀態(tài)反饋給APP層,是所有通訊功能的基礎(chǔ),因此必須設(shè)置。
(2)其他關(guān)于IM、VoIP通話、音視頻功能的回調(diào)監(jiān)聽可根據(jù)業(yè)務(wù)使用情況進(jìn)行增減,相互之間沒有影響。
示例代碼如下:
//設(shè)置登錄回調(diào)監(jiān)聽 ECDevice.setOnDeviceConnectListener(new ECDevice.OnECDeviceConnectListener() { public void onConnect() { //兼容舊版本的方法,不必處理 } @Override public void onDisconnect(ECError error) { //兼容舊版本的方法,不必處理 } @Override public void onConnectState(ECDevice.ECConnectState state, ECError error) { if(state == ECDevice.ECConnectState.CONNECT_FAILED ){ if(error.errorCode == SdkErrorCode.SDK_KICKED_OFF) { Log.i("","==帳號(hào)異地登陸"); } else { Log.i("","==其他登錄失敗,錯(cuò)誤碼:"+ error.errorCode); } return ; } else if(state == ECDevice.ECConnectState.CONNECT_SUCCESS) { Log.i("","==登陸成功"); } } }); //IM接收消息監(jiān)聽,使用IM功能的開發(fā)者需要設(shè)置。 ECDevice.setOnChatReceiveListener(new OnChatReceiveListener() { @Override public void OnReceivedMessage(ECMessage msg) { Log.i("","==收到新消息"); } @Override public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) { //收到群組通知消息,可以根據(jù)ECGroupNoticeMessage.ECGroupMessageType類型區(qū)分不同消息類型 Log.i("","==收到群組通知消息(有人加入、退出...)"); } @Override public void onOfflineMessageCount(int count) { // 登陸成功之后SDK回調(diào)該接口通知帳號(hào)離線消息數(shù) } @Override public void onReceiveOfflineMessage(List msgs) { // SDK根據(jù)應(yīng)用設(shè)置的離線消息拉取規(guī)則通知應(yīng)用離線消息 } @Override public void onReceiveOfflineMessageCompletion() { // SDK通知應(yīng)用離線消息拉取完成 } @Override public void onServicePersonVersion(int version) { // SDK通知應(yīng)用當(dāng)前帳號(hào)的個(gè)人信息版本號(hào) } }); // VoIP通話狀態(tài)監(jiān)聽,使用VoIP通話功能的開發(fā)者需要設(shè)置。 ECVoIPCallManager callInterface = ECDevice.getECVoIPCallManager(); if(callInterface != null) { callInterface.setOnVoIPCallListener(new ECVoIPCallManager.OnVoIPListener() { @Override public void onCallEvents(ECVoIPCallManager.VoIPCall voipCall) { // 處理呼叫事件回調(diào) if(voipCall == null) { Log.e("SDKCoreHelper", "handle call event error , voipCall null"); return ; } // 根據(jù)不同的事件通知類型來處理不同的業(yè)務(wù) ECVoIPCallManager.ECCallState callState = voipCall.callState; switch (callState) { case ECCALL_PROCEEDING: Log.i("","正在連接服務(wù)器處理呼叫請(qǐng)求,callid:"+voipCall.callId); break; case ECCALL_ALERTING: Log.i("","呼叫到達(dá)對(duì)方,正在振鈴,callid:"+voipCall.callId); break; case ECCALL_ANSWERED: Log.i("","對(duì)方接聽本次呼叫,callid:"+voipCall.callId); break; case ECCALL_FAILED: // 本次呼叫失敗,根據(jù)失敗原因進(jìn)行業(yè)務(wù)處理或跳轉(zhuǎn) Log.i("","called:"+voipCall.callId+",reason:"+ voipCall.reason); break; case ECCALL_RELEASED: // 通話釋放[完成一次呼叫] break; default: Log.e("SDKCoreHelper", "handle call event error , callState " + callState); break; } } }); } //音視頻會(huì)議回調(diào)監(jiān)聽,使用音視頻會(huì)議功能的開發(fā)者需要設(shè)置。 if(ECDevice.getECMeetingManager() != null) { ECDevice.getECMeetingManager().setOnMeetingListener(new OnMeetingListener() { @Override Public void onReceiveInterPhoneMeetingMsg(ECInterPhoneMeetingMsg msg) { // 處理實(shí)時(shí)對(duì)講消息Push } @Override public void onReceiveVoiceMeetingMsg(ECVoiceMeetingMsg msg) { // 處理語音會(huì)議消息push } @Override public void onReceiveVideoMeetingMsg(ECVideoMeetingMsg msg) { // 處理視頻會(huì)議消息Push(暫未提供) } }); } // 接收來電時(shí),需要設(shè)置接收VoIP來電事件通知Intent。用于SDK回調(diào)對(duì)應(yīng)的activity。 // 呼入activity在sdk初始化的回 調(diào)onInitialized中設(shè)置。 // 呼入界面activity、開發(fā)者需創(chuàng)建或修改VoIPCallActivity類,可參考demo中的 // VoIPCallActivity.java(demo中的目錄:\app\src\main\java\com\yuntongxun\ecdemo\ui\voip) Intent intent = new Intent(getInstance().mContext, VoIPCallActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pendingIntent = PendingIntent.getActivity( getInstance().mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); ECDevice.setPendingIntent(pendingIntent);
注意事項(xiàng):
回調(diào)監(jiān)聽要放在初始化成功的onInitialized回調(diào)方法里面,這樣保證登錄成功之后就可以接收到他人的來電、消息、會(huì)議等。
設(shè)置完成登錄參數(shù)和通知回調(diào)監(jiān)聽,接下來調(diào)用驗(yàn)證參數(shù)并登錄SDK。如果返回是true,則說明參數(shù)正確。
//驗(yàn)證參數(shù)是否正確 if(params.validate()) { // 登錄函數(shù) ECDevice.login(params); }
接下來我們可以測(cè)試是否登錄成功。調(diào)試登錄回調(diào)監(jiān)聽(ECDevice.OnECDeviceConnectListener)來判斷連接狀態(tài)。登錄成功的errorcode為200。