1. 程式人生 > >Android接入容聯 雲通訊 音視訊通話功能

Android接入容聯 雲通訊 音視訊通話功能

好久沒有寫部落格,最近公司專案上需要實現音視訊通話的功能,基於某些原因,選擇了接入容聯 雲通訊。

這個平臺的SDK基礎版是可以免費接入的,限制註冊人數2000人,IM基礎功能基本上都有,這裡主要接入音視訊通話功能。

而官網提供的原始碼是沒有專門針對音視訊功能的,功能涵蓋很多,需要使用者自己去抽離出來,所以這兒寫一篇博文記錄一下。

我會在後邊給出我的原始碼地址。

2、進入控制檯,按照接入流程,一步一步的建立應用,選擇音視訊通話,獲取appkey和apptoken 。

3、點選專案上線,為專案開通IM功能,在IM管理中申請音視訊功能(點選上線以後才能選擇開通)

[圖片]

4、在IM管理中點選開發文件,下載必要的so檔案和jar包,選擇必要的許可權,配置gradle等。

5、基礎工作做完以後就開始初始化sdk,登陸服務等。(注意登陸,登陸監聽,來電訊息等都要放在初始化成功以後的

onInitialized()方法中)
 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("info","初始化SDK成功");

                    // 設定接收VoIP來電事件通知Intent
                    // 呼入介面activity、開發者需修改該類
                    Intent intent = new Intent(context, VedioActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                    ECDevice.setPendingIntent(pendingIntent);
                    //設定登入引數,可分為自定義方式和VoIP驗密方式。
                    //設定通知回撥監聽包含登入狀態監聽,接收訊息監聽,VoIP呼叫事件回撥監聽和設定接收VoIP來電事件通知Intent等。
                    //驗證引數是否正確,登陸SDK。
                   
                     //初始化成功以後先註冊登陸回撥監聽和voip通話監聽,然後再進行登陸
//                    setListener();
//                    login();
                }
                @Override
                public void onError(Exception exception) {
                    //在初始化錯誤的方法中列印錯誤原因
                    Log.i("info","初始化SDK失敗"+exception.getMessage());
                }
            });}
        // 已經初始化成功,後續開發業務程式碼。
        Log.i(TAG, "初始化SDK及登陸程式碼完成");
private void setListener() {

        Log.i("info","==執行連線操作==");
        // 設定SDK註冊結果回撥通知,當第一次初始化註冊成功或者失敗會通過該引用回撥
        // 通知應用SDK註冊狀態
        // 當網路斷開導致SDK斷開連線或者重連成功也會通過該設定回撥
        ECDevice.setOnDeviceConnectListener(new ECDevice.OnECDeviceConnectListener() {
            @Override
            public void onConnect() {
                Log.i("info","==連線==");
            }

            @Override
            public void onDisconnect(ECError ecError) {
                Log.i("info","==斷開連線==");
            }

            @Override
            public void onConnectState(ECDevice.ECConnectState ecConnectState, ECError ecError) {
                Log.i("info","====ecConnectState===" + ecConnectState + "==ecError==="+ecError.toString());
                if(ecConnectState == ECDevice.ECConnectState.CONNECT_FAILED ){
                    if(ecError.errorCode == SdkErrorCode.SDK_KICKED_OFF) {
                        Log.i("","==帳號異地登陸");
                    }
                    else {
                        Log.i("","==其他登入失敗,錯誤碼:"+ ecError.errorCode);
                    }
                    return ;
                }
                else if(ecConnectState == ECDevice.ECConnectState.CONNECT_SUCCESS) {
                    Log.i("","==登陸成功");
                }
            }
        });
        //通話監聽
        ECDevice.getECVoIPCallManager().setOnVoIPCallListener(new ECVoIPCallManager.OnVoIPListener() {
            @Override
            public void onDtmfReceived(String s, char c) {
                Log.i("info","=====onDtmfReceived======"+s.toString());
            }

            @Override
            public void onCallEvents(ECVoIPCallManager.VoIPCall voIPCall) {
                Log.i("info","=====onCallEvents======"+voIPCall.callId);
                Log.i("info","=====onCallEvents======"+voIPCall.callType);
                if(voIPCall==null) return;

                switch(voIPCall. callState){

                    case ECCALL_ALERTING:

                        Log.i("","對方振鈴");

                        break;

                    case ECCALL_PROCEEDING:
                        Log.i("","呼叫中");

                        break;

                    case ECCALL_ANSWERED:
                        Log.i("","John接受了呼叫應答");

                        break;

                    case ECCALL_FAILED://
                        Log.i("","呼叫失敗");

                        break;

                    case ECCALL_RELEASED:

                        //無論是Tony還是John主動結束通話,雙方都會進入到此回撥
                        Log.i("","結束當前通話");

                        break;

                    default:

                        break;
                }
            }

            @Override
            public void onMediaDestinationChanged(VoipMediaChangedInfo voipMediaChangedInfo) {
                Log.i("info","=====onMediaDestinationChanged======"+voipMediaChangedInfo.toString());
            }

            @Override
            public void onSwitchCallMediaTypeRequest(String s, ECVoIPCallManager.CallType callType) {
                Log.i("info","=====onSwitchCallMediaTypeRequest======"+s.toString());
                Log.i("info","=====onSwitchCallMediaTypeRequest======"+callType.toString());
            }

            @Override
            public void onSwitchCallMediaTypeResponse(String s, ECVoIPCallManager.CallType callType) {
                Log.i("info","=====onSwitchCallMediaTypeResponse======"+s.toString());
                Log.i("info","=====onSwitchCallMediaTypeResponse======"+callType.toString());
            }

            @Override
            public void onVideoRatioChanged(VideoRatio videoRatio) {
                Log.i("info","=====onVideoRatioChanged======"+videoRatio.toString());
            }
        });
//接收發送到的txt訊息
ECDevice.setOnChatReceiveListener(new OnChatReceiveListener() {
    @Override
    public void OnReceivedMessage(ECMessage ecMessage) {
        Log.d("", "[OnReceivedMessage] show notice true");
        if (ecMessage == null) {
            return;
        }

        if(ecMessage.getType()== ECMessage.Type.TXT){
            ECTextMessageBody textMessageBody = (ECTextMessageBody) ecMessage.getBody();
            String message = textMessageBody.getMessage();
            String[] arr =  message.split(",");
            ECSuperActivity.EXTRA_CALL_NUMBER = arr[0];
            ECSuperActivity.EXTRA_CALL_NAME = arr[1];
            ECSuperActivity.EXTRA_CALL_TYPE = arr[2];
            Log.i("aaaaaaaaa","aa====="+message);
        }
    }

    @Override
    public void onReceiveMessageNotify(ECMessageNotify ecMessageNotify) {

    }

    @Override
    public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage ecGroupNoticeMessage) {

    }

    @Override
    public void onOfflineMessageCount(int i) {

    }

    @Override
    public int onGetOfflineMessage() {
        return 0;
    }

    @Override
    public void onReceiveOfflineMessage(List<ECMessage> list) {

    }

    @Override
    public void onReceiveOfflineMessageCompletion() {

    }

    @Override
    public void onServicePersonVersion(int i) {

    }

    @Override
    public void onReceiveDeskMessage(ECMessage ecMessage) {

    }

    @Override
    public void onSoftVersion(String s, int i) {

    }
});
    }

    private void login() {

        //建立登入引數物件
        ECInitParams params = ECInitParams.createParams();
        //設定使用者登入賬號
        params.setUserid(Constents.id);
        //設定AppId
        params.setAppKey(Constents.appKey);
        //設定AppToken
        params.setToken(Constents.appToken);
        //設定登陸驗證模式:自定義登入方式
        params.setAuthType(ECInitParams.LoginAuthType.NORMAL_AUTH);
        //LoginMode(強制上線:FORCE_LOGIN  預設登入:AUTO。使用方式詳見注意事項)
        params.setMode(ECInitParams.LoginMode.AUTO);

        //驗證引數是否正確
        if(params.validate()) {
            // 登入函式
            ECDevice.login(params);
        }
    }

6、登陸成功後就可以開始呼叫使用者

//發起音訊通話
String mCurrentCallId = VoIPCallHelper.makeCall(ECVoIPCallManager.CallType.VOICE,id,name);
if (TextUtils.isEmpty(mCurrentCallId)){
    Toast.makeText(this, "呼叫失敗", Toast.LENGTH_SHORT).show();
}

//發起視訊通話

ECDevice.getECVoIPSetupManager().setVideoView(mRemote_video_view, mLocalvideo_view);
String mCurrentCallId = ECDevice.getECVoIPCallManager().makeCall(ECVoIPCallManager.CallType.VIDEO, id);
if (TextUtils.isEmpty(mCurrentCallId)) {
    Toast.makeText(this, "呼叫失敗", Toast.LENGTH_SHORT).show();
}

7、接收方的處理

//(1)如果視訊呼叫,則在接受呼叫之前,需要先設定視訊通話顯示的view

ECDevice.getECVoIPSetupManager().setVideoView(view, localView);

//view 顯示遠端視訊的surfaceview 

//localView本地顯示視訊的view

ECDevice.getECVoIpCallManager().acceptCall(mCurrentCallId);

//(2)John點選“拒絕”按鈕,音視訊拒絕的程式碼是一致的,呼叫的程式碼是:

ECDevice.getECVoIpCallManager().rejectCall(mCurrentCallId,”拒絕的原因,傳入整型值”); 

8、進入音視訊頁面時,需要設定建立通話狀態的監聽

VoIPCallHelper.setOnCallEventNotifyListener(this);
/**
 * VoIP通話狀態通知
 */
public interface OnCallEventNotifyListener {
    /**
     * 正在連線伺服器
     * @param callId 通話的唯一標識
     */
    void onCallProceeding(String callId);

    void onMakeCallback(ECError arg0, String arg1, String arg2);

    /**
     * 對方正在振鈴
     * @param callId 通話的唯一標識
     */
    void onCallAlerting(String callId);

    /**
     * 對方應答(通話完全建立)
     * @param callId 通話的唯一標識
     */
    void onCallAnswered(String callId);

    /**
     * 呼叫失敗
     * @param callId 通話的唯一標識(有可能為Null)
     * @param reason 呼叫失敗原因
     */
    void onMakeCallFailed(String callId, int reason);

    /**
     * VoIP通話結束
     * @param callId 通話的唯一標識
     */
    void onCallReleased(String callId);

    void onVideoRatioChanged(VideoRatio videoRatio);

}

在這些回撥方法中處理通話任務就重新整理通話雙方的頁面,建立通話時的頁面,結束通話通話的處理等。

這次實現音視訊通話在網上找了好久,都麼有找到比較適合的資源,也沒有實現的demo可供參考,所以我寫下這個篇文章,記錄一下實現的過程,後邊 會附上原始碼,希望能幫助到有需要的朋友。

相關推薦

Android接入 通訊 視訊通話功能

好久沒有寫部落格,最近公司專案上需要實現音視訊通話的功能,基於某些原因,選擇了接入容聯 雲通訊。 這個平臺的SDK基礎版是可以免費接入的,限制註冊人數2000人,IM基礎功能基本上都有,這裡主要接入音視訊通話功能。 而官網提供的原始碼是沒有專門針對音視訊功能的,功能涵蓋很

【轉+修改】通訊api調用短信發送調用

appid setresult imp mss 修改 正常 .cn tty err 轉自 https://my.oschina.net/u/1995134/blog/814540 需要榮聯雲通訊 的 相對應SDKjar包。 CCP_REST_SMS_SDK_JAVA_v

通訊傳送簡訊java實現

1.容聯雲通訊網址:https://www.yuntongxun.com/doc.html 點選簡訊開發手冊 2.下載原始碼 3. 註冊一個賬號,會生成相應的appid之類的資訊  4.新增一個測試手機號,意思就是新增一個允許往哪個手機號發簡訊 5.然

通訊攜手英孚教育,引領客服智慧化變革

教育市場經過了蓬勃的發展已經進入了初步成熟階段,市場紅利逐漸降低,企業的切入點逐漸變少。此時,企業的資源整合、技術革新和服務升級便顯得尤為重要。英孚教育作為全球私人英語教育機構,目前已經遍佈全球50多個國家,員工多達40000多人。隨著英孚教育市場的持續擴張,傳統的客服系統面臨越來越多的難題和壓力,

誰說做大客戶模式太重?通訊成為SaaS領域另類領先者

在每一個細分領域,均有一些“不為人知”的公司,我們稱之為“隱形冠軍”。這是因為,表面上它們的知名

通訊的學習筆記二

先把demo中的功能理清,分析需要哪些功能吧 容聯雲通訊中的demo也不是很複雜,執行demo。 剛進入的介面是一個登陸介面,這裡直接用手機號碼登陸,進入主介面 先看清單檔案,ECApplication類是程式開啟載入的類,先不管。程式的主入口是一個Lau

通訊匯入AS2.2遇到 app:transformNative_libsWithStripDebugSymbolForDebug

最近準備開發一個視訊會議功能,用的是容聯雲的sdk,匯入的時候出現了這樣的問題:app:transformNative_libsWithStripDebugSymbolForDebug  NullPointExecption(no message and error),百度

通訊手機註冊demo

SDKTestSendTemplateSMS.javapackage com.luheng.test; import java.util.HashMap; import java.util.Set; import com.cloopen.rest.sdk.CCPRestS

自己整合的androidIMdemo效果展示

最近在做關於容聯雲IM方面的功能,實現的主要是簡單的一對一的圖文聊天、語音聊天和視訊聊天,同時也包括使用sqlite儲存聊天資料之類的。因為公司沒有要求實現好友列表或者多人聊天之類的,所有暫時還沒有實現這些功能。本人也是剛工作不久,第一次寫部落格,學習到的東西也希望能夠分享

即時通訊視訊開發(十):實時語音通訊的迴音消除技術詳解

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(八):常見的實時語音通訊編碼標準》 《即時通訊

即時通訊視訊開發(九):實時語音通訊的迴音及迴音消除概述

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(七):音訊基礎及編碼原理入門》 《即時通訊音視

即時通訊視訊開發(八):常見的實時語音通訊編碼標準

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(六):如何開始音訊編解碼技術的學習》 《即時通

即時通訊視訊開發(七):音訊基礎及編碼原理入門

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(五):認識主流視訊編碼技術H.264》 《即時

即時通訊視訊開發(六):如何開始音訊編解碼技術的學習

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(四):視訊編解碼之預測技術介紹》 《即時通訊音

即時通訊視訊開發(五):認識主流視訊編碼技術H.264

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(三):視訊編解碼之編碼基礎》 《即時通訊音視訊

即時通訊視訊開發(四):視訊編解碼之預測技術介紹

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(二):視訊編解碼之數字視訊介紹》 《即時通訊音

即時通訊視訊開發(三):視訊編解碼之編碼基礎

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(一):視訊編解碼之理論概述》 《即時通訊音視訊

即時通訊視訊開發(二):視訊編解碼之數字視訊介紹

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 本文是系列文章中的第2篇,本系列文章的大綱如下:   《即時

即時通訊視訊開發(一):視訊編解碼之理論概述

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(二):視訊編解碼之數字視訊介紹》 《即時通訊音

[Android多媒體技術] 播放Raw/Assets視訊方法總結

前言 本文介紹如何通過系統MediaPlayer,IjkPlayer,ExoPlayer分別播放安卓專案下的Raw或Assets資料夾中的音視訊檔案。 在某些情況下,我們會把一些音視訊檔案,如Mp3,Mp4等,直接放在安裝包中的Raw或者Assets資料夾裡,這些音視訊檔案可能作為特定場景的提示音,或者視