TRTC Android端开发接入学习之实现视频通话(五)
前言:
经过上一篇《屏幕分享》功能的实践,我们知道了如何使用官方提供的功DEMO,快速开发。今天我们来尝试使用官方提供的组件和自定义的UI实现功能。
实现自定义 UI 界面
源码 文件夹 trtccallingdemo 中包含两个子文件夹 ui 和 model,其中 model 文件夹中包含了我们实现的可重用开源组件 TRTCCalling,您可以在 TRTCCalling.java 文件中看到该组件提供的接口函数。
您可以使用开源组件 TRTCCalling 实现自己的 UI 界面,即只复用 model 部分,自行实现 UI 部分。
步骤1:集成 SDK
音视频通话组件 TRTCCalling 依赖 TRTC SDK 和 IM SDK,您可以按照如下步骤将两个 SDK 集成到项目中。
方法一:通过 Maven 仓库依赖
1.在 dependencies 中添加 TRTCSDK 和 IMSDK 的依赖。
dependencies {
complie "com.tencent.liteav:LiteAVSDK_TRTC:latest.release"
complie 'com.tencent.imsdk:imsdk:latest.release'
// 由于我们使用到了 gson 解析,所以还需要依赖 google 的 Gson
complie 'com.google.code.gson:gson:latest.release'
}
说明:
两个 SDK 产品的最新版本号,可以在 实时音视频 和 即时通信 IM 的 Github 首页获取。
https://github.com/tencentyun/TRTCSDK
https://github.com/tencentyun/TIMSDK
2.在 defaultConfig 中,指定 App 使用的 CPU 架构。
defaultConfig {
ndk {
abiFilters "armeabi-v7a"
}
}
3.单击【Sync Now】同步 SDK。
说明:
若您的网络连接 jcenter 没有问题,SDK 会自动下载集成到工程里。
方法二:通过本地 AAR 依赖
如果您的开发环境访问 maven 仓库较慢,可以直接下载 ZIP 包,并按照集成文档手动集成到您的工程中。
SDK |
下载页面 |
集成指引 |
---|---|---|
TRTC SDK |
https://cloud.tencent.com/document/product/647/32689 |
https://cloud.tencent.com/document/product/647/32175 |
IM SDK |
https://cloud.tencent.com/document/product/269/36887 |
https://cloud.tencent.com/document/product/269/32679 |
步骤2:配置权限及混淆规则
在 AndroidManifest.xml 中配置 App 的权限,SDK 需要以下权限(6.0以上的 Android 系统需要动态申请相机、读取存储权限):
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />
在 proguard-rules.pro 文件,将 SDK 相关类加入不混淆名单:
-keep class com.tencent.** { *; }
步骤3:导入 TRTCCalling 组件
拷贝以下目录中的所有文件到您的项目中:
trtccallingdemo/src/main/java/com/tencent/liteav/trtccalling/model
步骤4:初始化并登录组件
1.调用 TRTCCallingImpl.sharedInstance(context)获取组件实例。
2.IM 登录
V2TIMManager.getInstance().login(userId, userSig,callback)
3. Calling组件登录
/**
*SDKAppId:腾讯云音视频控制台新建的APP的应用ID
*userid:当前用户的ID,字符串类型 a-z A-Z 0-9 -和_
*userSig:生成腾讯云安全保护签名(测试demo从简 本地生成,
*如果是正式发布需要放到后台接口放置被盗取)
**/
login(SDKAppID, userId, userSig, callback)
步骤5:实现 1v1 视频通话
6.发起方:调用 TRTCCalling 的 call() 方法发起通话的请求, 并传入用户 ID(userid)和通话类型(type),通话类型参数传入TYPE_VIDEO_CALL。
7.接收方:当接收方处于已登录状态时,会收到名为 onInvited() 的事件通知,回调中 callType 的参数是发起方填写的通话类型,您可以通过此参数启动相应的界面,如果希望接收方在不处于登录状态时也能收到通话请求,请参考 离线接听。
8.接收方:如果希望接听电话,接收方可以调用 accept() 函数,并同时调用 openCamera() 函数打开自己本地的摄像头。接收方也可以调用 reject() 拒绝此次通话。
9.当双方的音视频通道建立完成后,通话的双方都会接收到名为 onUserVideoAvailable() 的事件通知,表示对方的视频画面已经拿到。此时双方用户均可以调用startRemoteView() 展示远端的视频画面。远端的声音默认是自动播放的。
//1. 初始化组件
TRTCCalling sCall = TRTCCallingImpl.sharedInstance(context);
//2. 注册监听器
sCall.addDelegate(new TRTCCallingDelegate() {
//...省略一些监听代码
public void onInvited(String sponsor, final List<String> userIdList, boolean isFromGroup, int callType) {
// 收到来自 sponsor 发过来的通话请求,此处代码选择接听,您也可以调用 reject() 拒绝之。
sCall.accept();
// 接受通话请求之后,即可打开自己的摄像头
TXCloudVideoView localView = new TXCloudVideoView(mContext);
mParentView.add(localView);
sCall.openCamera(true, localView);
}
public void onUserVideoAvailable(final String userId, boolean isVideoAvailable) {
if (isVideoAvailable) {
//表示对方的视频画面已经拿到,此时可以展示对方的视频影像
TXCloudVideoView remoteView = new TXCloudVideoView(mContext);
mParentView.add(remoteView);
sCall.startRemoteView(userId, remoteView);
} else {
sCall.stopRemoteView(userId);
}
}
});
//3. 完成组件的登录,登录成功后才可以调用组件的其他功能函数
sCall.login(sdkappid, "aaa", usersig, new ActionCallback() {
public void onSuccess() {
//4. 此处为实例代码:我们在组件登录成功后即打开摄像头并呼叫用户“aaa”
TXCloudVideoView localView = new TXCloudVideoView(mContext);
mParentView.add(localView);
sCall.openCamera(true, localView);
sCall.call("aaa", TRTCCalling.TYPE_VIDEO_CALL);
}
});
步骤6:实现多人视频通话
10.发起方:多人视频通话需要调用 TRTCCalling 中的 groupCall() 函数,并传入用户列表(userIdList)、通话类型(type)、 IM 群组 ID(groupId),其中 userIdList 为必填参数,通话类型为必填参数传入TYPE_VIDEO_CALL,groupId 为选填参数。
11.接收端:通过名为 onInvited() 事件通知能够接收到此呼叫请求。
12.接收端:收到事件通知后可以调用 accept() 方法接听此次通话,也可以选择用 reject() 方法拒绝通话。
13.如果超过一定时间(默认30s)没有回复,接收方会收到 onCallingTimeOut() 的事件通知,发起方会收到 onNoResp(String userId) 事件通知。通话发起方在多个接收均未应答时 hangup() ,每个接收方均会收到 onCallingCancel() 事件通知。
14.如果需要离开当前多人通话可以调用 hangup() 方法。
15.如果通话中有用户中途加入或离开,那么其他用户均会接收到 onUserEnter() 或 onUserLeave() 事件通知。
说明:
接口 groupCall() 中的 groupID 参数是 IM SDK 中的群组 ID,如果填写该参数,那么通话请求消息是通过群消息系统广播出去的,这种消息广播方式比较简单可靠。如果不填写,那么 TRTCCalling 组件会采用单发消息逐一通知。
// 前面省略...
// 拼凑需要拨打的用户列表
List<String> callList = new ArrayList();
callList.add("bbb");
callList.add("ccc");
callList.add("ddd");
// 如果您不是在一个 IM 群里发起的, groupId 可以传一个空串;
sCall.groupCall(callList, TRTCCalling.TYPE_VIDEO_CALL, "");
//打开自己的摄像头
TXCloudVideoView localView = new TXCloudVideoView(mContext);
mParentView.add(localView);
sCall.openCamera(true, txCloudVideoView);
步骤7:实现离线接听
说明:
如果您的业务定位是在线客服等不需要离线接听功能的场景,那么完成上述 的对接即可。但如果您的业务定位是社交场景,建议实现离线接听。
IM SDK 支持离线推送,但是 Android 端各个手机厂商均有各自的离线推送服务,因此接入复杂度要高于 iOS 平台,您需要进行相应的设置才能达到可用标准。
16.申请对应厂商的推送渠道需要的证书等,并将其配置到即时通信 IM 控制台中,按照推送要求增加证书和 ID 等,详细的操作步骤请参见 https://cloud.tencent.com/document/product/269/44516
17.目前在 TRTCCallingImpl 的 sendModel 信令发送函数中已经集成了离线发送的函数,当配置好 App 的离线推送后,消息就可实现离线推送。
- PyTorch发布一周年:盘点社区和工程大事件,后来者居上态势已显?
- 2018年AI如何发展?普华永道做出了8点预测 | 报告下载
- 不正之风!机器学习论文里都有哪四大投机取巧的写作手法?
- 前端写一个月的原生 Android 是怎样一种体验?
- 给人挖矿还不自知 电脑已变黑客肉鸡
- 反序列化漏洞屡被黑客利用,危害巨大,代码怎样写才安全?
- Mifa 主题微信编辑器
- Mifa GitHub Pages 主题
- Mifa Design:一个服务于 Markdown 的设计体系
- 未来机器人大脑将获取互联网知识自我学习
- 【架构拾集】: Android 移动应用架构设计
- Dore 混合应用框架 —— 基于 React Native 的混合应用迁移方案
- Android6.0源码分析之View(二)--measure Android6.0源码分析之View(一)
- 程序员,2017年你的技能树上增加了哪些新技能?
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释