TRTC Android端开发接入学习之实现视频通话(五)

2020-09-10 13:10:26 浏览数 (1)

前言:

经过上一篇《屏幕分享》功能的实践,我们知道了如何使用官方提供的功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 的离线推送后,消息就可实现离线推送。

0 人点赞