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