Android接入容联 云通讯 音视频通话功能

2023-10-14 17:59

本文主要是介绍Android接入容联 云通讯 音视频通话功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

好久没有写博客,最近公司项目上需要实现音视频通话的功能,基于某些原因,选择了接入容联 云通讯。

这个平台的SDK基础版是可以免费接入的,限制注册人数2000人,IM基础功能基本上都有,这里主要接入音视频通话功能。

而官网提供的源码是没有专门针对音视频功能的,功能涵盖很多,需要用户自己去抽离出来,所以这儿写一篇博文记录一下。

1、首先需要去平台注册账号,https://www.yuntongxun.com/

官网源码下载地址:https://www.yuntongxun.com/doc/ready/demo/1_4_1_1.html

我会在后边给出我的源码地址。

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() {@Overridepublic 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();}@Overridepublic 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() {@Overridepublic void onConnect() {Log.i("info","==连接==");}@Overridepublic void onDisconnect(ECError ecError) {Log.i("info","==断开连接==");}@Overridepublic 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() {@Overridepublic void onDtmfReceived(String s, char c) {Log.i("info","=====onDtmfReceived======"+s.toString());}@Overridepublic 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;}}@Overridepublic void onMediaDestinationChanged(VoipMediaChangedInfo voipMediaChangedInfo) {Log.i("info","=====onMediaDestinationChanged======"+voipMediaChangedInfo.toString());}@Overridepublic void onSwitchCallMediaTypeRequest(String s, ECVoIPCallManager.CallType callType) {Log.i("info","=====onSwitchCallMediaTypeRequest======"+s.toString());Log.i("info","=====onSwitchCallMediaTypeRequest======"+callType.toString());}@Overridepublic void onSwitchCallMediaTypeResponse(String s, ECVoIPCallManager.CallType callType) {Log.i("info","=====onSwitchCallMediaTypeResponse======"+s.toString());Log.i("info","=====onSwitchCallMediaTypeResponse======"+callType.toString());}@Overridepublic void onVideoRatioChanged(VideoRatio videoRatio) {Log.i("info","=====onVideoRatioChanged======"+videoRatio.toString());}});
//接收发送到的txt消息
ECDevice.setOnChatReceiveListener(new OnChatReceiveListener() {@Overridepublic 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);}}@Overridepublic void onReceiveMessageNotify(ECMessageNotify ecMessageNotify) {}@Overridepublic void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage ecGroupNoticeMessage) {}@Overridepublic void onOfflineMessageCount(int i) {}@Overridepublic int onGetOfflineMessage() {return 0;}@Overridepublic void onReceiveOfflineMessage(List<ECMessage> list) {}@Overridepublic void onReceiveOfflineMessageCompletion() {}@Overridepublic void onServicePersonVersion(int i) {}@Overridepublic void onReceiveDeskMessage(ECMessage ecMessage) {}@Overridepublic void onSoftVersion(String s, int i) {}
});
    }private void login() {//创建登录参数对象ECInitParams params = ECInitParams.createParams();//设置用户登录账号params.setUserid(Constents.id);//设置AppIdparams.setAppKey(Constents.appKey);//设置AppTokenparams.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可供参考,所以我写下这个篇文章,记录一下实现的过程,后边 会附上源码,希望能帮助到有需要的朋友。

 

github地址:https://github.com/XW837156540/RongyunDemo

这篇关于Android接入容联 云通讯 音视频通话功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/212182

相关文章

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功