您可以阅读本文,了解Android端语音聊天室的集成操作。

Demo运行指引

  1. 前提条件

    开发前的环境要求如下表所示,详情请参见使用限制

    类别 说明
    系统版本 支持Android 4.1及以上。
    API版本 不低于16
    CPU架构 支持真机架构armeabi、armeabi-v7a、arm64-v8a (不支持模拟器x86架构)。
  2. 获取Demo源码
    如果您需要语音聊天室开源示例项目,请添加钉钉群获取:顶顶群码
  3. SDK集成
    1. SDK集成请参见文档Android SDK集成
    2. 使用Maven集成

      在app目录下的build.gradle中配置Maven引用

      dependencies {
          implementation 'com.aliyun.rtc:AliRTC-Full:sdk版本号'
      }
      在根目录的build.gradle中配置仓库地址
      allprojects {
          repositories {
              google()
              jcenter()
              //添加RTC需要的maven地址
              maven {
                  url "http://maven.aliyun.com/nexus/content/groups/public/"
              }
          }
      }
  4. 运行Demo
    1. 打开Android Studio,点击Open an existing Android Studio project选择out目录下的demo。选择Demo
    2. 点击Sync Project with Gradle Files按钮同步下工程。Sync Project with Gradle Files
    3. 选择真机,点击build and run按钮进行编译并运行。build and run

快速跑通Demo

在运行Demo前,需先跑通Server端的代码,然后将Server的请求地址粘贴到com.aliyun.rtc.audiochatroom.constant.Constant文件中的BASE_URL变量,

BASE_URL变量

Demo源码解析

  1. 项目结构说明
    • RTCAudioLiveRoom:语聊房功能实现库。
    • RTCSolutionCommon:公共组建库。
    • RTCViewCommon:公共UI库。
    • app:程序入口。
    • thirdparty-lib:第三方库的引用。
    目录结构1
    • adapter:列表控件adapter。
    • bean:实体类。
    • Constant:常量数据管理类,在这配置Server端请求域名和分享链接的域名。
    • api:网络请求。
    • rtc:RTC。
    • ui:放的互动界面和登录界面。
    • util:工具类。
    • view:自定义view。
    目录结构2
  2. 功能实现流程

    接口

    API 描述
    sharedInstance 获取单例对象
    destorySharedInstance 毁单例对象
    login 加入房间
    logout 退出房间
    setAudioEffectVolume 设置音效音量
    setAudioAccompanyVolume 设置伴奏音量
    enterSeat 上麦
    leavelSeat 下麦
    setRTCAudioLiveRoomDelegate 设置监听回调
    muteLocalMic 设置是否静音
    muteRomteAudioPlaying 设置是否本地静音
    enableEarBack 是否开启耳返
    startAudioAccompany 播放伴奏
    stopAudioAccompany 停止伴奏
    playAudioEffect 播放音效
    stopAudioEffect 停止音效
    setAudioEffectReverbMode 设置音效场景(混音模式)
    setAudioEffectVoiceChangerMode 设置变声音效模式

    事件回调

    API 描述
    onEnterSeat 用户上麦通知
    onLeaveSeat 用户下麦通知
    onOccurError 错误信息通知
    onUpdateRoleNotify 切换用户角色回调
    onPublishChangedNotify 推流回调
    onJoinChannelResult 加入频道结果回调
    onLeaveChannelResult 离开频道结果回调
    onSeatVolumeChanged 音量大小提示
    onAudioPlayingStateChanged 伴奏播放回调
    onUserAudioMuted 用户muteAudio通知回调
    onRoomDestroy 房间被销毁回调
    onNetworkQualityChanged 网络状态回调

    接口示例

    • 获取单例对象

      接口名称:sharedInstance。

      获取BaseRTCAudioLiveRoom的实例对象,初始化RTC SDK。

          /**
           * 获取单例
           */
          public static BaseRTCAudioLiveRoom sharedInstance() {
              return RTCAudioLiveRoomImpl.sharedInstance();
          }
    • 毁单例对象

      接口名称:destorySharedInstance。

      销毁BaseRTCAudioLiveRoom的实例对象,销毁后需要再调用sharedInstance接口再次初始化实例。

          /**
           * 销毁实例
           */
          public abstract void destorySharedInstance();
    • 加入房间

      接口名称:login。

      根据选中的角色类型、房间号、用户名加入RTC频道。

       /**
           * 加入房间
           *
           * @param role           角色类型
           * @param channelId      房间号
           * @param userName       用户名
           */
          public abstract void login(String channelId, String userName, AliRtcEngine.AliRTCSDK_Client_Role role);
    • 退出房间

      接口名称:logout。

      退出RTC频道。

          /**
           * 退出房间
           */
          public abstract void logout();
    • 设置音效音量

      接口名称:setAudioEffectVolume。

      同时设置播放和推流的音量。

          /**
           * 设置音效音量
           * 
           * @param soundId 音效文件的sourceId
           * @param volume 音量 区间0-100
           *
           */
          public abstract void setAudioEffectVolume(int soundId, int volume);
    • 设置伴奏音量

      接口名称:setAudioAccompanyVolume。

      同时设置播放和推流的音量。

          /**
           * 设置伴奏音量
           * @param volume 音量 区间0-100
           */
          public abstract void setAudioAccompanyVolume(int volume);
    • 上麦

      接口名称:enterSeat。

      切换互动角色。

          /**
           * 上麦
           */
          public abstract void enterSeat();
    • 下麦

      接口名称:leavelSeat。

      切换观众角色。

          /**
           * 下麦
           */
          public abstract void leaveSeat();
    • 设置监听回调

      接口名称:setRTCAudioLiveRoomDelegate。

              /**
           * 设置监听
           *
           * @param audioLiveRoomDelegate 监听
           */
          public abstract void setRTCAudioLiveRoomDelegate(RTCAudioLiveRoomDelegate audioLiveRoomDelegate);        
    • 设置是否静音

      接口名称:muteLocalMic。

          /**
           * 是否开启静音模式
           *
           * @param mute true为静音 false不静音
           * @return 0表示设置成功,反之失败
           */
          public abstract int muteLocalMic(boolean mute);
    • 设置是否本地静音

      接口名称:muteRomteAudioPlaying。

      true表示本地听不到远端的声音,false表示本地可以听到远端声音。

          /**
           * 停止远端的所有音频流的播放。返回0为成功,其他返回错误码。
           *
           * @param enableSpeakerPhone true为开启 false关闭
           * @return 0表示设置成功,反之失败
           */
          public abstract int muteAllRemoteAudioPlaying(boolean enableSpeakerPhone);
    • 是否开启耳返

      接口名称:enableEarBack。

          /**
           * 是否耳返
           *
           * @param enableEarBack 是否开启耳返 true为开启 false关闭
           * @return 0表示设置成功,反之失败
           */
          public abstract int enableEarBack(boolean enableEarBack);
    • 播放伴奏

      接口名称:startAudioAccompany。

          /**
           * 开始伴奏
           *
           * @param fileName      伴奏文件路径,支持本地文件和网络url
           * @param onlyLocalPlay 是否仅本地播放,true表示仅仅本地播放,false表示本地播放且推流到远端
           * @param replaceMic    是否替换mic的音频流,true表示伴奏音频流替换本地mic音频流,false表示伴奏音频流和mic音频流同时推
           * @param loopCycles    循环播放次数,-1表示一直循环
           */
          public abstract void startAudioAccompany(String fileName, boolean onlyLocalPlay, boolean replaceMic, int loopCycles);
    • 停止伴奏

      接口名称:stopAudioAccompany。

          /**
           * 停止伴奏
           */
          public abstract void stopAudioAccompany();
    • 播放音效

      接口名称:playAudioEffect。

          /**
           * 播放音效
           *
           * @param soundId  音效ID
           * @param filePath 音效文件路径,支持本地文件和网络url
           * @param cycles   循环播放次数。-1表示一直循环
           * @param publish  是否将音效音频流推到远端
           */
          public abstract void playAudioEffect(int soundId, String filePath, int cycles, boolean publish);
    • 停止音效

      接口名称:stopAudioEffect。

          /**
           * 停止音效
           *
           * @param soundId 音效ID
           */
          public abstract void stopAudioEffect(int soundId);
    • 设置音效场景(混音模式)

      接口名称:setAudioEffectReverbMode。

          /**
           * 设置音效场景
           * @param aliRtcAudioEffectReverbMode 音效场景枚举
           */
          public abstract void setAudioEffectReverbMode(AliRtcEngine.AliRtcAudioEffectReverbMode aliRtcAudioEffectReverbMode);
    • 设置变声音效模式

      接口名称:setAudioEffectVoiceChangerMode。

          /**
           * 设置变声音效模式
           *
           * @param mode 模式
           * @return int 结果码 0为成功
           */
          public abstract int setAudioEffectVoiceChangerMode(AliRtcEngine.AliRtcAudioEffectVoiceChangerMode mode);

    回调通知

    • 用户上麦通知

      回调名称:onEnterSeat。

          /**
           * 上麦通知回调
           *
           * @param seatInfo 麦位信息
           */
          void onEnterSeat(SeatInfo seatInfo);
    • 用户下麦通知

      回调名称:onLeaveSeat

          /**
           * 下麦通知回调
           *
           * @param seatInfo 麦位信息
           */
          void onLeaveSeat(SeatInfo seatInfo);
    • 错误信息通知

      回调名称:onOccurError。

      当错误码是以下几种情况时,需要销毁SDK实例:
      • ErrorCodeEnum.ERR_ICE_CONNECTION_HEARTBEAT_TIMEOUT
      • ErrorCodeEnum.ERR_SDK_INVALID_STATE
      • ErrorCodeEnum.ERR_SESSION_REMOVED
          /**
           * sdk报错
           * @param error 错误码
           */
          void onOccurError(int error);
    • 切换用户角色回调

      回调名称:onUpdateRoleNotify。

          /**
           * 角色切换成功
           *
           * @param oldRole 旧的用户角色
           * @param newRole 新的用户角色
           */
          void onUpdateRoleNotify(AliRtcEngine.AliRTCSDK_Client_Role oldRole, AliRtcEngine.AliRTCSDK_Client_Role newRole);
    • 推流回调

      回调名称:onPublishChangedNotify。

          /**
           * 推流结果回调
           * @param result 返回码 0表示推流成功,反之失败
           * @param isPublished 是否再推流
           */
          void onPublishChangedNotify(int result, boolean isPublished);
    • 加入频道结果回调

      回调名称:onJoinChannelResult。

      result为0表示加入房间成功,反之失败。

          /**
           * 登陆回调
           *
           * @param result 状态码
           * @param uid 自己的uid
           */
          void onJoinChannelResult(int result, String uid);
    • 离开频道结果回调

      回调名称:onLeaveChannelResult。

          /**
           * 退出房间回调
           * @param result 退出房间回调 0表示成功 反之失败
           */
          void onLeaveChannelResult(int result);
    • 音量大小提示

      回调名称:onSeatVolumeChanged。

      当某个用户说话状态改变是才会回调(从说话到不说话,或者从不说话到说话)。

          /**
           * 用户音量更新回调
           * @param seatIndex 麦序
           * @param isSpeaking 是否正在说话
           */
          void onSeatVolumeChanged(int seatIndex, boolean isSpeaking);
    • 伴奏播放回调

      回调名称:onAudioPlayingStateChanged。

      背景音乐播放状态的回调。

          /**
           * 播放状态更新回调
           *
           * @param audioPlayingStatus 当前播放状态
           */
          void onAudioPlayingStateChanged(AliRtcEngine.AliRtcAudioPlayingStateCode audioPlayingStatus);
    • 用户muteAudio通知回调

      回调名称:onUserAudioMuted。

      某个用户静音时回调该用户当前的麦序和静音状态。

          /**
           * 用户静音回调
           *
           * @param seatIndex 麦序
           * @param mute      是否静音
           */
          void onSeatMutedChanged(int seatIndex, boolean mute);
    • 房间被销毁回调

      回调名称:onRoomDestroy。

          /**
           * 房间被销毁回调
           */
          void onRoomDestroy();
    • 网络状态回调
      回调名称:onNetworkQualityChanged。
          /**
           * 网络状态回调
           *
           * @param aliRtcNetworkQuality1 下行网络质量
           * @param aliRtcNetworkQuality  上行网络质量
           * @param s                     String  用户ID
           */
          void onNetworkQualityChanged(String s, AliRtcEngine.AliRtcNetworkQuality aliRtcNetworkQuality, AliRtcEngine.AliRtcNetworkQuality aliRtcNetworkQuality1);