TRTC Android端开发接入学习之实现语音通话(六)

时间:2022-07-24
本文章向大家介绍TRTC Android端开发接入学习之实现语音通话(六),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言:

在上一篇《视频通话》中,我们实现了双方的视频通话,总所周知没有声音再好的戏也出不来,本期我们来学习如何使用TRTC完成语音通话的功能。

实现步骤

第一步:集成SDK

音视频通话组件 TRTCCalling 依赖 TRTC SDK 和 IM SDK,可以参考官方提供的集成指引,完成集成 TRTC集成文档IM集成文档

DEMO中主要文件

文件或文件夹

功能描述

TRTCAudioCallActivity.java

展示语音通话的主界面,通话的接听和拒绝就是在这个界面中完成的。

TRTCCallingEntranceActivity.java

用于展示选择联系人的界面,可以通过此界面搜索已注册用户,发起通话。

audiolayout

用于通话过程中用户画面的渲染和排布逻辑。

第二步:配置对应权限和混淆规则

<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.** { *; } 

第三步:在GenerateTestUserSig.java中配置SDKID和SECRETKEY

SDKAPPID:在音视频控制台中对应创建的应用的ID

SECRETKEY:音视频控制台对应的计算密钥,点击查看密钥获得

第四步:初始化SDK和登录

  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)  

第五步:实现通话功能

  • 1V1通话实现
  1. 发起方:调用 TRTCCalling 的 call() 方法发起通话的请求, 并传入用户 ID(userid)和通话类型(type),通话类型参数传入TYPE_AUDIO_CALL。
  2. 接收方:当接收方处于已登录状态时,会收到名为 onInvited() 的事件通知。
  3. 接收方:如果希望接听通话,接收方可以调用 accept()函数,或者调用 reject() 拒绝此次通话。
  4. 当双方的音视频通道建立完成后,通话的双方都会接收到名为 onUserEnter() 的事件通知,此时说明双方已经进入通话。
// 注册监听器
sCall.addDelegate(new TRTCCallingDelegate() {
    //...省略一些监听代码
    public void onInvited(String sponsor, final List<String> userIdList, boolean isFromGroup, int callType) {
        // 收到来自 sponsor 发过来的通话请求,此处代码选择接听,您也可以调用 reject() 拒绝之。
        scall.accept();
    } 
    public void onUserEnter(final String userId) {
        //用户接收了通话请求。此处编写接收后UI变化
    }
});
sCall.login(sdkappid, "aaa", usersig, new ActionCallback() {
    public void onSuccess() {
        sCall.call("aaa",TRTCCalling.TYPE_AUDIO_CALL);
    }
});
  • 多人通话
  1. 发起方:多人视频通话需要调用 TRTCCalling 中的 groupCall() 函数,并传入用户列表(userIdList)、通话类型(type)、 IM 群组 ID(groupId),其中 userIdList 为必填参数,通话类型为必填参数传入TYPE_AUDIO_CALL, groupId 为选填参数。
  2. 接收端:通过 onInvited() 事件通知能够接收到此次请求。
  3. 接收端:收到事件通知后可以调用 accept() 方法接听此次通话,也可以选择用 reject() 方法拒绝通话。
  4. 如果超过一定时间(默认30s)没有回复,接收方会收到 onCallingTimeOut() 的事件通知,发起方会收到 onNoResp(String userId) 事件通知。通话发起方在多个接收均未应答时 hangup() , 每个接收方均会收到 onCallingCancel() 事件通知。
  5. 如果需要离开当前多人通话可以调用 hangup() 方法。
  6. 如果通话中有用户中途加入或离开,那么其他用户均会接收到 onUserEnter() 或 onUserLeave() 事件通知。
// 前面省略...
// 拼凑需要拨打的用户列表
List<String> callList = new ArrayList();
callList.add("bbb");
callList.add("ccc");
callList.add("ddd");
// 如果您不是在一个 IM 群里发起的, groupId 可以传一个空串;
sCall.groupCall(callList, TRTCCalling.TYPE_AUDIO_CALL, "");

//结束通话  挂断
mTRTCCalling.hangup();