您可以阅读本文,了解Android端超级小班课的集成操作。

前提条件

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

类别 说明
系统版本 支持Android 4.1及以上。
API版本 不低于16。
CPU架构 支持真机架构armeabi、armeabi-v7a、arm64-v8a (不支持模拟器x86架构)。
Android Studio版本支持 支持Android Studio3.0及以上。下载Android Studio

您需要集成并启动Web端,具体操作,请参见Web集成

Demo运行指引

说明 您在集成Android端时,如果遇到Demo体验过程中出现无法创建房间或通话等问题,请参见Android端运行常见问题
  1. 获取应用ID和AppKey。
    说明

    应用ID和AppKey需要对应,不同的应用ID有不同的AppKey。

    在后续开发中会使用应用ID和AppKey,建议记录到本地文档中,妥善保存。

    1. 登录RTC控制台
    2. 在左侧导航栏单击应用管理,进入应用管理页面。
    3. 获取应用ID和查询AppKey。
      • 应用ID:可在应用ID/名称列表下直接获取。
      • AppKey:单击查询AppKey获取AppKey。
      如果您还未有应用,您可以单击创建应用创建。获取AppKey和应用ID
  2. 下载Demo并解压。
    解压成功之后如下图所示:目录
    说明
    • Demo源码中已经集成AliRTC SDK。
    • 源码压缩文件内分为Web端、Android端、iOS端三个文件。
    • 若遇到GitHub代码库下载缓慢的问题,可通过安装加速插件等方式加速下载。
  3. Android Studio打开Android端工程。
    打开Android Studio,单击Open an existing Android Studio project并选择android目录下的RtcSolutionSuperClassRoom文件夹。导入源码
  4. 修改配置文件。

    打开Android Studio,在Demo中找到RTCSuperClassRoom/RTCSuperClassRoom_Demo/src/main/java/com/aliyun/rtc/superclassroom/utils/MockAliRtcAuthInfo.java文件。填写AppId和AppKey。

    配置文件
    注意

    本Demo中在客户端代码配置AppId和AppKey的方式,很容易被反编译逆向破解,一旦AppId和AppKey泄露,攻击者就可以盗用您的阿里云流量,因此该配置方式仅适合用于本地Demo的运行和功能调试。

    正确的Token签发方式是将Token的计算代码集成到您的服务端,并提供面向App的接口,在需要Token时由您的App接口向业务服务器发起请求获取动态Token。具体操作,请参见生成Token

  5. 选择一台已连接的真机设备。(暂不支持模拟器运行)
    将一台Android真机设备(需在系统设置中开启开发者模式和USB调试功能)使用数据线与电脑连接,在手机端同意调试后在Android Studio中选择接入的真机设备。
  6. 单击build and run编译,Android真机会安装并启动超级小班课App。
    bulid and run
  7. 开启超级小班课。

    Android端主要为学生听课场景。

    1. 教师由Web端输入姓名进入教室,为助教和学生发送教室码。
    2. 助教由Web端输入姓名和教室码进入教室,选择需要管理的小组进行管理。
    3. 学生由Web端或移动端(Android或iOS)输入姓名和教室码进行教室听课学习,还可以进行连麦互动。

Demo源码解析

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

    接口

    API 描述
    sharedInstance 获取单例对象
    destorySharedInstance 毁单例对象
    login 加入房间
    logout 退出房间
    muteLocalCamera 切换是否停止发布本地视频
    muteLocalMic 切换是否停止发布本地音频
    switchCamera 切换摄像头
    getUserInfo 获取用户信息
    registerCallBack 注册回调
    startPreview 开始预览
    stopPreview 停止预览
    startPublish 开始推流
    stopPublish 停止推流
    setRemoteViewConfig 设置远端画面
    getRemoteUserList 获取远端用户列表
    isInCall 是否入会
    isPreview 是否预览

    事件回调

    API 描述
    onJoin 用户上线通知
    onLeave 用户下线通知
    onOccurError SDK报错
    onOccurWarning SDK警告
    onRoomDestroy 房间被销毁的回调
    onSDKError SDK报错,需要销毁实例
    onJoinChannelResult 加入房间通知
    onLeaveChannelResult 离开房间通知
    onNetworkQualityChanged 网络状态回调
    onUserVideoMuted 用户muteVideo通知
    onUserAudioMuted 用户muteAudio通知
    onSubscribeResult 订阅成功回调
    onUserSpeaking 判断用户是否在说话
    onRemoteTraceAvaliable 当订阅情况发生变化时回调

    接口示例

    • 获取单例对象

      接口名称:sharedInstance。

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

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

      接口名称:destorySharedInstance。

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

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

      接口名称:login。

      根据输入的房间号、用户名加入RTC频道。

      /**
           * 登录
           *
           * @param channelId 房间号
           * @param userName 昵称
           */
          public abstract void login(String channelId,  String userName);
    • 退出房间

      接口名称:logout。

      退出RTC频道。

          /**
           * 登出
           */
          public abstract void logout();
    • 切换是否停止发布本地视频

      接口名称:muteLocalCamera。

          /**
           * 切换是否停止发布本地视频
           * @param channelId  频道号
           * @param isMute 是否停止发布
           */
          public abstract void muteLocalCamera(String channelId,boolean isMute); 
    • 切换是否停止发布本地音频

      接口名称:muteLocalMic。

      /**
           * 切换是否停止发布本地音频
           *  @param channelId  频道号
           *  @param isMute 是否停止发布
           */
          public abstract void muteLocalMic(String channelId,boolean isMute);
    • 设置摄像头接口

      名称:switchCamera。

          /**
           * 设置摄像头
           */
          public abstract void switchCamera();
    • 获取用户信息

      接口名称:getUserInfo。

       /**
           * 获取用户信息
           * @param channelId  频道号
           * @param userId 用户id
           */
          public abstract AliRtcRemoteUserInfo getUserInfo(String channelId, String userId);
    • 注册回调

      接口名称:registerCallBack。

       /**
           * 注册回调
           */
          public abstract void registerCallBack(RTCSuperClassCallback rtcSuperClassCallback);
    • 开始预览

      接口名称:startPreview。

      /**
           * 开始预览
           * @param viewGroup  显示画面的view
           */
          public abstract void startPreview(ViewGroup viewGroup);
    • 停止预览

      接口名称:stopPreview。

          /**
           * 停止预览
           */
          public abstract void stopPreview();
    • 开始推流

      接口名称:startPublish。

          /**
           * 开始推流
           * @param channelId  频道号
           */
          public abstract void startPublish(String channelId);
    • 停止推流

      接口名称:stopPublish。

         /**
           * 停止推流
           * @param channelId  频道号
           */
          public abstract void stopPublish(String channelId);
    • 设置远端画面

      接口名称:setRemoteViewConfig。

      /**
           * 设置远端画面
           * @param channelId  频道号
           * @param canvas canvas对象
           * @param track track对象
           */
          public abstract void setRemoteViewConfig(String channelId, AliRtcEngine.AliVideoCanvas canvas, String uid, AliRtcEngine.AliRtcVideoTrack track);
    • 获取远端用户列表

      接口名称:getRemoteUserList。

       /**
           * 获取远端用户列表
           * @param channelId  频道号
           */
          public abstract List<RTCUserInfo> getRemoteUserList(String channelId);
    • 是否入会

      接口名称:isInCall。

        /**
           * 是否入会
           * @param channelId  频道号
           */
          public abstract boolean isInCall(String channelId);
    • 是否预览

      接口名称:isPreview。

       /**
           * 是否预览
           * @param channelId  频道号
           */
          public abstract boolean isPreview(String channelId);

    回调通知

    • 用户上线通知
      回调名称:onJoin。
         /**
           * 用户上线通知
           *
           * @param userId 用户id
           */
          void onJoin(String channelId,String userId);
    • 用户下线

      通知调名称:onLeave。

       /**
           * 用户下线通知
           * @param channelId  频道号
           * @param userId 用户id
           */
          void onLeave(String channelId,String userId);
    • SDK报错通知
      回调名称:onOccurError。
          /**
           * sdk报错
           *
           * @param channelId  频道号
           */
          void onOccurError(String channelId,int error);
    • SDK警告

      回调名称:onOccurWarning。

          /**
           * sdk警告
           *
           * @param channelId  频道号
           */
          void onOccurWarning(String channelId,int error);
    • 房间被销毁的回调

      回调名称:onRoomDestroy。

          /**
           * 房间被销毁的回调
           * @param channelId  频道号
           */
          void onRoomDestroy(String channelId);
    • SDK报错,需要销毁实例

      回调名称:onSDKError。

          /**
           * sdk报错,需要销毁实例
           * @param channelId  频道号
           */
          void onSDKError(String channelId,int error);
    • 加入房间通知

      回调名称:onJoinChannelResult。

          /**
           * 加入房间通知
           * @param channelId  频道号
           * @param result 0为成功 反之失败
           */
          void onJoinChannelResult(String channelId,int result);
    • 离开房间通知

      回调名称:onLeaveChannelResult。

          /**
           * 离开房间通知
           * @param channelId  频道号
           */
          void onLeaveChannelResult(String channelId,int result);
    • 网络状态

      回调名称:onNetworkQualityChanged。

       /**
            * 网络状态回调
            *
            * @param channelId  频道号
            * @param aliRtcNetworkQuality1 下行网络质量
            * @param aliRtcNetworkQuality  上行网络质量
            * @param userId                     String  用户ID
            */
          void onNetworkQualityChanged(String channelId,String userId, AliRtcEngine.AliRtcNetworkQuality aliRtcNetworkQuality, AliRtcEngine.AliRtcNetworkQuality aliRtcNetworkQuality1);
    • 用户muteVideo通知

      回调名称:onUserVideoMuted。

      /**
           * 用户muteVideo通知
           * @param channelId  频道号
           */
          void onUserVideoMuted(String channelId,String userId, boolean mute);
    • 用户muteAudio通知

      回调名称:onUserAudioMuted。

       /**
           * 用户muteAudio通知
           * @param channelId  频道号
           */
          void onUserAudioMuted(String channelId,String userId, boolean mute);
    • 订阅成功

      回调名称:onSubscribeResult。

       /**
           *
           * 订阅成功
           * @param channelId  频道号
           * @param userId  用户ID
           * @param result  0表示订阅成功,非0表示失败
           * @param videoTrack     订阅成功的视频流
           * @param audioTrack     订阅成功的音频流
           */
          void onSubscribeResult(String channelId,String userId, int result, AliRtcEngine.AliRtcVideoTrack videoTrack, AliRtcEngine.AliRtcAudioTrack audioTrack);
    • 判断用户是否在说话

      回调名称:onUserSpeaking。

       /**
           *
           * 用户是否在说话
           * @param channelId  频道号
           * @param userId  用户ID
           * @param isSpeaking 是否正在说话
           */
          void onUserSpeaking(String channelId,String userId, boolean isSpeaking);
    • 当订阅情况发生变化时的回调

      回调名称:onRemoteTraceAvaliable。

        /**
            *
            * 当订阅情况发生变化时,返回这个消息 onSubscribeChangedNotify
            * @param channelId  频道号
            * @param userId  用户ID
            * @param videoTrack     订阅成功的视频流
            * @param audioTrack     订阅成功的音频流
            */
          void onRemoteTraceAvaliable(String channelId,String userId, AliRtcEngine.AliRtcAudioTrack audioTrack, AliRtcEngine.AliRtcVideoTrack videoTrack);