前言:
经过上一篇《屏幕分享》功能的实践,我们知道了如何使用官方提供的功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 的依赖。
代码语言:javascript复制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 架构。
代码语言:javascript复制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 系统需要动态申请相机、读取存储权限):
代码语言:javascript复制<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 相关类加入不混淆名单:
代码语言:javascript复制-keep class com.tencent.** { *; }
步骤3:导入 TRTCCalling 组件
拷贝以下目录中的所有文件到您的项目中:
代码语言:javascript复制trtccallingdemo/src/main/java/com/tencent/liteav/trtccalling/model
步骤4:初始化并登录组件
1.调用 TRTCCallingImpl.sharedInstance(context)获取组件实例。
2.IM 登录
代码语言:javascript复制 V2TIMManager.getInstance().login(userId, userSig,callback)
3. Calling组件登录
代码语言:javascript复制/**
*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() 展示远端的视频画面。远端的声音默认是自动播放的。
代码语言:javascript复制//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 组件会采用单发消息逐一通知。
代码语言:javascript复制// 前面省略...
// 拼凑需要拨打的用户列表
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 的离线推送后,消息就可实现离线推送。