主动呼叫 | 被叫接听 |
---|---|
如需快速实现语音通话功能,您可以直接基于我们提供的 Demo 进行修改适配,也可以使用我们提供的 TRTCCalling 组件并实现自定义 UI 界面。
注意:我们之前提供了 TRTCAudioCall 组件,旧版本组件已经移动到 组件仓库 中。TRTCCalling 组件使用了 IM 信令的接口,将不再与旧组件兼容。
注意:
本功能同时使用了腾讯云 实时音视频 TRTC 和 即时通信 IM 两个基础 PaaS 服务,开通实时音视频后会同步开通即时通信 IM 服务。 即时通信 IM 属于增值服务,详细计费规则请参见 即时通信 IM 价格说明。
Android/TRTCScenesDemo/debug/src/main/java/com/tencent/liteav/debug/GenerateTestUserSig.java
文件。GenerateTestUserSig.java
文件中的相关参数:注意:
- 本文提到的生成 UserSig 的方案是在客户端代码中配置 SECRETKEY,该方法中 SECRETKEY 很容易被反编译逆向破解,一旦您的密钥泄露,攻击者就可以盗用您的腾讯云流量,因此该方法仅适合本地跑通 Demo 和功能调试。
- 正确的 UserSig 签发方式是将 UserSig 的计算代码集成到您的服务端,并提供面向 App 的接口,在需要 UserSig 时由您的 App 向业务服务器发起请求获取动态 UserSig。更多详情请参见 服务端生成 UserSig。
使用 Android Studio(3.5 以上的版本)打开源码工程 TRTCDemo
,单击【运行】即可开始调试本 Demo。
源码文件夹 trtccallingdemo
中包含两个子文件夹 ui 和 model,其中 ui 文件夹中均为界面代码:
文件或文件夹 | 功能描述 |
---|---|
TRTCAudioCallActivity.java | 展示语音通话的主界面,通话的接听和拒绝就是在这个界面中完成的。 |
TRTCCallingEntranceActivity.java | 用于展示选择联系人的界面,可以通过此界面搜索已注册用户,发起通话。 |
audiolayout | 用于通话过程中用户画面的渲染和排布逻辑。 |
源码 文件夹 trtccallingdemo
中包含两个子文件夹 ui 和 model,其中 model 文件夹中包含了我们实现的可重用开源组件 TRTCCalling,您可以在 TRTCCalling.java
文件中看到该组件提供的接口函数。
您可以使用开源组件 TRTCCalling 实现自己的 UI 界面,即只复用 model 部分,自行实现 UI 部分。
音视频通话组件 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 | 集成文档 |
在 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.** { *; }
拷贝以下目录中的所有文件到您的项目中:
trtccallingdemo/src/main/java/com/tencent/liteav/trtccalling/model
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());
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);
}
});
TRTCCalling
中的 groupCall()
函数,并传入用户列表(userIdList)、通话类型(type)、 IM 群组 ID(groupId),其中 userIdList 为必填参数,通话类型为必填参数传入TYPE_AUDIO_CALL
, groupId 为选填参数。onInvited()
事件通知能够接收到此次请求。accept()
方法接听此次通话,也可以选择用 reject()
方法拒绝通话。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, "");
说明:如果您的业务定位是在线客服等不需要离线接听功能的场景,那么完成上述 步骤1 - 步骤6 的对接即可。但如果您的业务定位是社交场景,建议实现离线接听。
IM SDK 支持离线推送,但是 Android 端各个手机厂商均有各自的离线推送服务,因此接入复杂度要高于 iOS 平台,您需要进行相应的设置才能达到可用标准。
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 | 是否开启免提 |
通过RAM Policy,您可以集中管理您的用户(例如员工、系统或应用程序),以及控...
在Logtail采集配置中设置时间格式,请遵循以下注意事项。 日志服务的时间戳只支...
1. 接口描述 接口请求域名: vpc.tencentcloudapi.com 。 创建终端节点服务。 默...
当今的软件工程访谈经常涉及某种编码测试或编程练习,我认为这是一件很糟糕的事...
蒋江伟 / 文 对于云计算的用户来说,理解什么是云原生尤为重要。不是简单地使用...
1. 接口描述 接口请求域名: vpc.tencentcloudapi.com 。 本接口 (AssociateAddr...
用户需求和云的发展两条线推动了云原生技术的兴起、发展和大规模应用。本文将主...
2020年,有很大一部分人都只能远程办公,于是很多人开始通过别的途径展示自己的...
我国提出雪亮工程、平安城市、智慧城市项目,以扩大视频监控覆盖面、推动全国联...
SSL证书签发后或成功上传后,可以在华为云的其他云产品中使用,如WAF、ELB、CDN...