效果展示
主动呼叫 | 被叫接听 |
---|---|
如需快速实现语音通话功能,您可以直接基于我们提供的 Demo 进行修改适配,也可以使用我们提供的 TRTCCalling 组件并实现自定义 UI 界面。
注意:我们之前提供了 TRTCAudioCall 组件,旧版本组件已经移动到 组件仓库 中。TRTCCalling 组件使用了 IM 信令的接口,将不再与旧组件兼容。
复用 Demo 的 UI 界面
步骤1:创建新的应用
- 登录实时音视频控制台,选择【开发辅助】>【快速跑通Demo】。
- 输入应用名称,例如 TestAudioCall ,单击【创建】。
注意:
本功能同时使用了腾讯云 实时音视频 TRTC 和 即时通信 IM 两个基础 PaaS 服务,开通实时音视频后会同步开通即时通信 IM 服务。 即时通信 IM 属于增值服务,详细计费规则请参见 即时通信 IM 价格说明。
步骤2:下载 SDK 和 Demo 源码
- 根据实际业务需求下载 SDK 及配套的 Demo 源码。
- 下载完成后,单击【已下载,下一步】。
步骤3:配置 Demo 工程文件
- 进入修改配置页,根据您下载的源码包,选择相应的开发环境。
- 找到并打开
Android/TRTCScenesDemo/debug/src/main/java/com/tencent/liteav/debug/GenerateTestUserSig.java
文件。 - 设置
GenerateTestUserSig.java
文件中的相关参数:- SDKAPPID:默认为0,请设置为实际的 SDKAppID。
- SECRETKEY:默认为空字符串,请设置为实际的密钥信息。
- 粘贴完成后,单击【已复制粘贴,下一步】即创建成功。
- 编译完成后,单击【回到控制台概览】即可。
注意:
- 本文提到的生成 UserSig 的方案是在客户端代码中配置 SECRETKEY,该方法中 SECRETKEY 很容易被反编译逆向破解,一旦您的密钥泄露,攻击者就可以盗用您的腾讯云流量,因此该方法仅适合本地跑通 Demo 和功能调试。
- 正确的 UserSig 签发方式是将 UserSig 的计算代码集成到您的服务端,并提供面向 App 的接口,在需要 UserSig 时由您的 App 向业务服务器发起请求获取动态 UserSig。更多详情请参见 服务端生成 UserSig。
步骤4:运行 Demo
使用 Android Studio(3.5 以上的版本)打开源码工程 TRTCDemo
,单击【运行】即可开始调试本 Demo。
步骤5:修改 Demo 源代码
源码文件夹 trtccallingdemo
中包含两个子文件夹 ui 和 model,其中 ui 文件夹中均为界面代码:
文件或文件夹 | 功能描述 |
---|---|
TRTCAudioCallActivity.java | 展示语音通话的主界面,通话的接听和拒绝就是在这个界面中完成的。 |
TRTCCallingEntranceActivity.java | 用于展示选择联系人的界面,可以通过此界面搜索已注册用户,发起通话。 |
audiolayout | 用于通话过程中用户画面的渲染和排布逻辑。 |
实现自定义 UI 界面
源码 文件夹 trtccallingdemo
中包含两个子文件夹 ui 和 model,其中 model 文件夹中包含了我们实现的可重用开源组件 TRTCCalling,您可以在 TRTCCalling.java
文件中看到该组件提供的接口函数。
您可以使用开源组件 TRTCCalling 实现自己的 UI 界面,即只复用 model 部分,自行实现 UI 部分。
步骤1:集成 SDK
音视频通话组件 TRTCCalling 依赖 TRTC SDK 和 IM SDK,您可以按照如下步骤将两个 SDK 集成到项目中。
方法一:通过 Maven 仓库依赖
在 dependencies 中添加 TRTC SDK 和 IM SDK 的依赖。
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 首页获取。
在 defaultConfig 中,指定 App 使用的 CPU 架构。
defaultConfig { ndk { abiFilters "armeabi-v7a" } }
单击【Sync Now】同步 SDK。
说明:若您的网络连接 jcenter 没有问题,SDK 会自动下载集成到工程里。
方法二:通过本地 AAR 依赖
如果您的开发环境访问 maven 仓库较慢,可以直接下载 ZIP 包,并按照集成文档手动集成到您的工程中。
SDK | 下载页面 | 集成指引 |
---|---|---|
TRTC SDK | DOWNLOAD | 集成文档 |
IM SDK | DOWNLOAD | 集成文档 |
步骤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:初始化并登录组件
- 调用
TRTCCallingImpl.sharedInstance(context)
获取组件实例。 - 调用
login(SDKAppID, userId, userSig, callback)
完成组件的登录,其中几个关键参数的填写请参考下表:参数名 作用 SDKAppID 您可以在 实时音视频控制台 中查看 SDKAppID。 userId 当前用户的 ID,字符串类型,只允许包含英文字母(a-z 和 A-Z)、数字(0-9)、连词符(-)和下划线(_)。 userSig 腾讯云设计的一种安全保护签名,计算方式请参考 如何计算 UserSig。 // 初始化 sCall = TRTCCallingImpl.sharedInstance(context); sCall.login(1400000123, "userA", "xxxx", new ActionCallback());
步骤5:实现1v1语音通话
- 发起方:调用
TRTCCalling
的call()
方法发起通话的请求, 并传入用户 ID(userid)和通话类型(type),通话类型参数传入TYPE_AUDIO_CALL
。 - 接收方:当接收方处于已登录状态时,会收到名为
onInvited()
的事件通知。如果希望接收方在不处于登录状态时也能收到通话请求,请参考 离线接听。 - 接收方:如果希望接听通话,接收方可以调用
accept()
函数,或者调用reject()
拒绝此次通话。 - 当双方的音视频通道建立完成后,通话的双方都会接收到名为
onUserEnter()
的事件通知,此时说明双方已经进入通话。
//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();
}
});
//3. 完成组件的登录,登录成功后才可以调用组件的其他功能函数
sCall.login(sdkappid, "aaa", usersig, new ActionCallback() {
public void onSuccess() {
//4. 此处为实例代码:我们在组件登录成功后呼叫用户“aaa”,类型传入TYPE_AUDIO_CALL
sCall.call("aaa",TRTCCalling.TYPE_AUDIO_CALL);
}
});
步骤6:实现多人语音通话
- 发起方:多人视频通话需要调用
TRTCCalling
中的groupCall()
函数,并传入用户列表(userIdList)、通话类型(type)、 IM 群组 ID(groupId),其中 userIdList 为必填参数,通话类型为必填参数传入TYPE_AUDIO_CALL
, groupId 为选填参数。 - 接收端:通过
onInvited()
事件通知能够接收到此次请求。 - 接收端:收到事件通知后可以调用
accept()
方法接听此次通话,也可以选择用reject()
方法拒绝通话。 - 如果超过一定时间(默认30s)没有回复,接收方会收到
onCallingTimeOut()
的事件通知,发起方会收到onNoResp(String userId)
事件通知。通话发起方在多个接收均未应答时hangup()
, 每个接收方均会收到onCallingCancel()
事件通知。 - 如果需要离开当前多人通话可以调用
hangup()
方法。 - 如果通话中有用户中途加入或离开,那么其他用户均会接收到
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_AUDIO_CALL, "");
步骤7:实现离线接听
说明:如果您的业务定位是在线客服等不需要离线接听功能的场景,那么完成上述 步骤1 - 步骤6 的对接即可。但如果您的业务定位是社交场景,建议实现离线接听。
IM SDK 支持离线推送,但是 Android 端各个手机厂商均有各自的离线推送服务,因此接入复杂度要高于 iOS 平台,您需要进行相应的设置才能达到可用标准。
- 申请对应厂商的推送渠道需要的证书等,并将其配置到即时通信 IM 控制台中,按照推送要求增加证书和 ID 等,详细的操作步骤请参见 即时通信 IM > 离线推送(Android) 。
- 目前在 TRTCCallingImpl 的 sendModel 信令发送函数中已经集成了离线发送的函数,当配置好 App 的离线推送后,消息就可实现离线推送。
组件 API 列表
TRTCCalling 组件的 API 接口列表如下:
接口函数 | 接口功能 |
---|---|
addDelegate | 增加 TRTCCalling 监听器,用户可以通过该监听器获取状态通知 |
removeDelegate | 移除监听器 |
destroy | 销毁实例 |
login | 登录 IM,所有功能需要先进行登录后才能使用 |
logout | 登出 IM,登出后无法再进行拨打操作 |
call | C2C 邀请通话,被邀请方会收到 onInvited 的事件通知 |
groupCall | IM 群组邀请通话,被邀请方会收到 onInvited 的事件通知 |
accept | 作为被邀请方接听来电 |
reject | 作为被邀请方拒绝来电 |
hangup | 结束通话 |
startRemoteView | 将远端用户的摄像头数据渲染到指定的 TXCloudVideoView 中 |
stopRemoteView | 停止渲染某个远端用户的摄像头数据 |
openCamera | 开启摄像头,并渲染在指定的 TXCloudVideoView 中 |
closeCamera | 关闭摄像头 |
switchCamera | 切换前后摄像头 |
setMicMute | 是否静音 mic |
setHandsFree | 是否开启免提 |