前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TRTC Android端开发接入学习之实现视频通话(五)

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

原创
作者头像
腾讯云-hongyang
修改2020-09-10 13:10:26
2.5K0
修改2020-09-10 13:10:26
举报

前言:

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
    • 实现自定义 UI 界面
    • 步骤1:集成 SDK
      • 方法一:通过 Maven 仓库依赖
        • 方法二:通过本地 AAR 依赖
        相关产品与服务
        即时通信 IM
        即时通信 IM(Instant Messaging)基于腾讯二十余年的 IM 技术积累,支持Android、iOS、Mac、Windows、Web、H5、小程序平台且跨终端互通,低代码 UI 组件助您30分钟集成单聊、群聊、关系链、消息漫游、群组管理、资料管理、直播弹幕和内容审核等能力。适用于直播互动、电商带货、客服咨询、社交沟通、在线课程、企业办公、互动游戏、医疗健康等场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档