Agora 在线语音聊天室开发上手和源码解读 | 掘金技术征文

2,120 阅读5分钟

使用声网的在线语音聊天室 SDK 能够实现开黑聊天室、娱乐房间、K 歌房、FM 超高音质房等各种语音聊天室所需要的音频功能。

场景描述

语音聊天室 是一种纯音频的使用场景。用户作为主播或者听众加入房间进行语音聊天,也可以在房间内任意切换自己的主播/听众身份。

这个示例程序展示了对音频设置有不同的需求的四种常见语音聊天室类型:

  • 开黑聊天室: 频道内用户需要频繁上下麦,用户不想花费过多流量
  • 娱乐房间: 频道内用户需要频繁上下麦,用户对流量使用不敏感,对音质有要求
  • K 歌房: 满足唱歌场景需求,还原KTV效果
  • FM 超高音质房间: 超高音质,声音还原度高,语音电台主播首选

体验 Demo

官方提供了 Demo 供你下载体验。你可直接下载安装 Android apk 安装包 或者 iOS Appstore 进行体验。

成功运行 Demo 后,在界面上创建房间,输入频道名称,并选择一种房间类型。使用另一台设备进入房间,即为观众观看。观众可以申请上麦从而实现和房主的实时互动。

下载 Android 开发代码,进行本地开发测试

  1. 像以往使用声网产品进行开发一样,你需要先在 Agora.io 中创建自己的项目,并获取到相应的 App ID。如果你还没注册,记得先注册一下 dashboard.agora.io/cn/signup/。

  1. 下载 Agora 语音通话/语音直播 SDK

  2. 将有效的 AppID 填写进 "Android/app/src/main/res/values/strings_config.xml"

<?xml version="1.0" encoding="UTF-8"?>

<resources>
    <!-- PLEASE KEEP THIS App ID IN SAFE PLACE -->
    <!-- Get your own App ID at https://dashboard.agora.io/ -->
    <!-- After you entered the App ID, remove <##> outside of Your App ID -->
    <!-- For formal released project, please use Security Keys/Token
        https://docs.agora.io/en/Video/token?platform=All%20Platforms -->
    <string name="private_app_id"><#YOUR APP ID#></string>
</resources>

找到下面这一行,把你的 AppID 填写进去。

<string name="private_app_id"><#YOUR APP ID#></string>
  1. 解压 SDK 压缩包,将其中的 libs 文件夹下的 *.jar 复制到本项目的 app/libs 下,其中的 libs 文件夹下的 arm64-v8a/x86/armeabi-v7a 复制到本项目的 app/src/main/jniLibs 下。

  2. 使用 Android Studio 打开该项目,连接 Android 测试设备,编译并运行。

运行环境:

  • Android Studio 3.1 +
  • Android SDK API Level >= 16
  • Android 4.1 或以上支持语音和视频功能的真机设备

功能列表

这个示例程序演示了如何使用 声网 Agora 的音频SDK,实现不同类型语音聊天室的音频聊天功能。

  • 加入房间:选择一个房间类型,使用主播或听众的身份加入房间,和房间内的其他用户进行语音交流;
  • 主播/听众切换:在房间内可以随时使用“上麦”按钮来切换自己的主播/听众身份;
  • 听筒/外放切换:可以使用“外放”按钮切换听筒或外放;
  • 停止发送音频:主播可以使用“静音自己”按钮停止发送音频;
  • 停止接收音频:可以使用“不收音频”按钮停止接收房间内其他人的音频;
  • 音乐伴奏:主播可以使用“伴奏”按钮播放伴奏音乐并发送给房间内其他人;
  • 变声效果:主播可以使用“变声”按钮选择自己的变声效果。

源码解读

在体验了 SDK 的基本功能后,让我们看看源码,这些功能是如何实现的。

在文件 Chatroom/Android/app/src/test/java/io/agora/chatroom/ExampleUnitTest.java 中,我们可以看到,这是一个简单的单元测试:

package io.agora.chatroom;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

Mainfest 中是进行基本设置,Chatroom/Android/app/src/main/AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="io.agora.chatroom">

    <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.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".RoomActivity"
            android:screenOrientation="portrait"/>
    </application>

</manifest>

此外,在 Chatroom/Android/app/src/androidTest/java/io/agora/chatroom/ExampleInstrumentedTest.java 这里我们还可以看到 Instrumente 测试用例,这个 SDK 的测试用例可以说是比较完善了。

package io.agora.chatroom;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("io.agora.chatroom", appContext.getPackageName());
    }
}

当然,真正核心的代码是在这里 Chatroom/Android/app/src/main/java/io/agora/。

首先在 Chatroom/Android/app/src/main/java/io/agora/utils/Constant.java 这里进行了一些定义。

package io.agora.utils;

/**
 * Created by yt on 2018/8/15/015.
 */

public class Constant {
    // 开黑聊天室
    public static final int ChatRoomGamingStandard = 0x01;
    // 娱乐聊天室
    public static final int ChatRoomEntertainmentStandard = 0x02;
    // K 歌房
    public static final int ChatRoomEntertainmentHighQuality = 0x03;
    // FM 超高音质
    public static final int ChatRoomGamingHighQuality = 0x04;

    // 开黑聊天室
    public static final String ChatRoomGamingStandardName = "ChatRoomGamingStandard";
    // 娱乐聊天室
    public static final String ChatRoomEntertainmentStandardName = "ChatRoomEntertainmentStandard";
    // K 歌房
    public static final String ChatRoomEntertainmentHighQualityName = "ChatRoomEntertainmentHighQuality";
    // FM 超高音质
    public static final String ChatRoomGamingHighQualityName = "ChatRoomGamingHighQuality";

    public static final String ACTION_KEY_CROLE = "C_Role";
    public static final String ACTION_KEY_ROOM_MODE = "ecHANELMODE";
    public static final String ACTION_KEY_ROOM_NAME = "ecHANEL";
    public static final String ACTION_KEY_TITLE_NAME = "eTITLE";

    public static String[] SOUNDARRAY = new String[] {
            "大叔","正太","猪八戒","空灵",
            "浩克","萝莉","电台KTV","演唱会",
            "录音棚", "流行", "R&B", "嘻哈", "摇滚"
    };
}

在这里 Chatroom/Android/app/src/main/java/io/agora/adapter/UsesAdapter.java 进行了用户列表的适配。

在这里 Chatroom/Android/app/src/main/java/io/agora/chatroom/RoomActivity.java 可以看到,聊天室内的这些互动功能是如何实现的,很值得学习。代码有些长,我就不贴出来了。

在这里 Chatroom/Android/app/src/main/java/io/agora/chatroom/User.java 实现了聊天室的用户判断。

感兴趣的,建议你到 官方库 github.com/AgoraIO-Use… 看详细代码,并下载体验一下。


Agora SDK 使用体验征文大赛 | 掘金技术征文,征文活动正在进行中