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
自己整合的android容聯雲IMdemo效果展示
最近在做關於容聯雲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資料夾裡,這些音視訊檔案可能作為特定場景的提示音,或者視