快速入门音频通话

最近更新时间:2021-07-08 01:48:25

本文主要介绍如何将 RTC Android SDK 音频通话集成到你的项目中以及相关注意事项。

开发环境要求

  • Android SDK API Level ≥ 19
  • 如果你的 App 以 Android 9 及以上为目标平台,请关注 Android 隐私权变更
  • Android Studio 3.0 或以上版本。
  • 一个有效的 开发者账号

运行环境要求

你需要有一台 Android 真机。

获取 AppID

参考以下步骤获取一个 AppID。若已经拥有 AppID,请跳过当前步骤,直接查看快速集成

  • 1. 创建项目

    首先我们需要在开发者控制台创建一个「项目」。

  • 2. 获取 APP ID

    获取项目的「APP ID」

集成 SDK

选择如下任意一种方式将 SDK 集成到你的项目中。

方法一:使用 JCenter 自动集成

在项目的 /app/build.gradle 文件中,添加如下行:

...
dependencies {
    ...
    // a.b.c.d 请填写具体版本号,如:4.1.4.3
    // 可通过 SDK 发版说明取得最新版本号
    implementation 'io.anyrtc:rtc:a.b.c.d'
}

请点击查看发版说明获取最新版本号。

方法二:手动复制 SDK 文件

  1. SDK 下载页面,获取最新版的语音 SDK,然后解压。
  2. 将 SDK 包内 libs 路径下的如下文件,拷贝到你的项目路径下:
文件或文件夹项目路径
arrtcengine-release 文件/app/libs/

添加项目权限

根据场景需要,在 /app/src/main/AndroidManifest.xml 文件中添加如下行,获取相应的设备权限:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

如果你的 targetSdkVersion ≥ 29,还需要在 AndroidManifest.xml 文件的 `` 区域添加如下行:

   <application
      android:requestLegacyExternalStorage="true">
      ...
   </application>

防止代码混淆

app/proguard-rules.pro 文件中添加如下行,防止混淆 SDK 的代码:

-keep class org.ar.**{*;}
-keep class org.webrtc.**{*;}

操作流程

本节内容主要介绍如何实现音频通话,提供相关示例代码。

初始化客户端

将获取到的 App ID 添加到 string.xml 文件中的 ar_app_id 一栏。调用 create 方法,传入获取到的 App ID,即可完成初始化 。

使用相同 App ID 的应用才能互相通信。

加入频道

完成初始化后,你就可以调用 joinChannel 方法加入频道。你需要在该方法中传入如下参数:

  • token:传入能标识用户角色和权限的 Token。可设为如下一个值:
    • 临时 Token。临时 Token 服务有效期为 15小时、24 小时、3天、15天不等。你可以在控制台里生成一个临时 Token。
    • 在你的服务器端生成的 Token。在安全要求高的场景下,我们推荐你使用此种方式生成的 Token,详见生成 Token
    • 若项目已启用 权限密钥,请使用 Token。请勿将 token 设为 ""。
mRtcEngine?.joinChannel(getString(R.string.ar_token),channelId,"",VoiceLive.voiceLive.userId)

    @Override
    public int joinChannel(String token, String optionalInfo, String uid, ChannelMediaOptions options) {
        if (!this.mInitialized) {
            return -7;
        } else {
            Context context = this.mRtcEngineImpl.getContext();
            if (context == null) {
                return -7;
            } else {
                this.mJoined = true;
                return this.nativeRtcChannelJoinChannel(this.mNativeHandle, token, optionalInfo, uid,options ==null ? true:options.autoSubscribeAudio,options ==null ? true:options.autoSubscribeVideo);
            }
        }
    }

音频直播

在加入频道后,对频道内的远端用户进行监听。

  // 注册 onUserOffline 回调。远端用户离开频道后,会触发该回调。
        override fun onUserOffline(uid: String?, reason: Int) {
            super.onUserOffline(uid, reason)
            runOnUiThread {
                var leftIndex = -1
                infoAdapter.data.forEachIndexed { index, infoBean ->
                    if (infoBean.userId==uid) {
                        leftIndex = index
                    }
                }
                if (leftIndex != -1){
                    infoAdapter.remove(leftIndex)
                }
            }
        }

  // 注册 onUserMuteAudio 回调。远端用户静音后,会触发该回调。
   @Deprecated
    public void onUserMuteAudio(String uid, boolean muted) {
    }

    // 注册 onUserMuteAudio 回调。远端用户静音后,会触发该回调。
    @Deprecated
    public void onUserMuteAudio(String uid, boolean muted) {
    }

离开频道

根据场景需要,如结束通话、关闭 App 或 App 切换至后台时,调用 leaveChannel 离开当前通话频道。

    private fun release(){
        mRtcEngine?.leaveChannel()
        RtcEngine.destroy()
        mRtcEngine=null
    }

开发注意事项

  • 在收发音频流,或者频道操作前,需要确保已经成功加入频道。