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

环境要求

Android端具体环境要求,更多信息,请参见使用限制

前提条件

  • Web端服务已集成并开启。具体操作,请参见Web集成
  • 环境中已安装Android Studio 3.0或以上版本。更多信息,请参见Android Studio

操作步骤

  1. 获取AppID和AppKey。此处建议记录一下AppID和AppKey,方便后续操作中使用。
    1. 登录RTC控制台
    2. 在左侧导航栏单击应用管理,进入应用管理页面。
    3. AppID/名称列获取AppID。
    4. 单击操作列的查询AppKey,获取AppKey。
    说明 如果应用列表中没有您需要的应用,可以单击创建应用,创建新的应用。具体操作,请参见创建应用
  2. 下载并解压Demo,更多信息,请参见Demo源码下载
    说明
    • 源码压缩文件内分为Android、iOS、Electron、Server四端文件。
    • 如果GitHub代码库下载缓慢,可安装加速插件等方式加速下载。
  3. 配置Demo工程。

    根据步骤1中获取的AppID和AppKey修改RTCSuperClassRoom/RTCSuperClassRoom_Demo/src/main/java/com/aliyun/rtc/superclassroom/utils/MockAliRtcAuthInfo.java文件中appIDappKey的值。

    配置文件
    说明 此处配置的AppID和AppKey很容易被反编译破解,如果被破解,攻击者可以盗用您的阿里云流量,因此AppID和AppKey仅适用于Demo演示及功能调试。在正式环境中您可以将Token计算代码集成到服务器中,并提供面向App的接口,在需要Token时由App向业务服务器发起请求获取动态Token。更多信息,请参见使用Token鉴权
  4. app/src/main/AndroidManifest.xml文件中添加如下代码,获取相应的设备权限。
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> 
  5. 可选:配置防止代码混淆。

    proguard-rules.pro文件中,添加-keep类的配置,可以防止混淆RTC SDK公共类名称。

    -keep class com.serenegiant.**{*;}
    -keep class org.webrtc.**{*;}
    -keep class com.alivc.**{*;}    
  6. 运行Demo。
    1. 打开Android Studio,单击Open an Existing Project,选择android目录下的RtcSolutionSuperClassRoom文件夹。
    2. 单击002,同步工程。
    3. 将Android设备与电脑有线连接,并在Android Studio中选择相对应的设备(暂不支持模拟器运行),单击003,编译并运行。如果编译过程中出现问题或无法正常通话,请参见Android端运行常见问题
      bulid and run
      说明 将Android设备和电脑有线连接时,需要在Android设备的设置中开启开发者模式和USB调试模式,同时在Android设备上选择同意调试。
  7. 开启超级小班课。
    1. 教师由Web端输入姓名进入教室,为助教和学生发送教室码。
    2. 助教由Web端输入姓名和教室码进入教室,选择需要管理的小组进行管理。
    3. 学生由Web端或移动端输入姓名和教室码进行教室听课学习,还可以进行连麦互动。

Demo目录结构说明

项目结构如下所示:

文件名 说明
RTCSuperClassRoom 超级小班课功能实现库。更多信息,请参见RTCSuperClassRoom组件库目录说明
RTCSolutionCommon 公共组建库。
RTCViewCommo 公共UI库。
app 程序入口。
thirdparty-lib 第三方库的引用。

RTCSuperClassRoom组件库目录说明,如下所示:

文件名 说明
activity activity类。
adapter 列表控件adapter。
api 网络请求。
bean 实体类。
constant 常量数据管理类,在此配置服务端请求域名和分享链接的域名。
rtc RTC。
ui 互动界面和登录界面。
util 工具类。
view 自定义view。

API说明

表 1. 功能实现接口
API 描述
sharedInstance 获取单例对象。
destorySharedInstance 毁单例对象。
login 加入房间。
logout 退出房间。
muteLocalCamera 切换是否停止发布本地视频。
muteLocalMic 切换是否停止发布本地音频。
switchCamera 切换摄像头。
getUserInfo 获取用户信息。
registerCallBack 注册回调。
startPreview 开始预览。
stopPreview 停止预览。
startPublish 开始推流。
stopPublish 停止推流。
setRemoteViewConfig 设置远端画面。
getRemoteUserList 获取远端用户列表。
isInCall 是否入会。
isPreview 是否预览。
表 2. 回调接口
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);
  • onOccurError:SDK报错通知。
        /**
         * sdk报错
         *
         * @param channelId  频道号
         */
        void onOccurError(String channelId,int error);
  • onOccurWarning:SDK警告。
        /**
         * sdk警告
         *
         * @param channelId  频道号
         */
        void onOccurWarning(String channelId,int error);
  • onRoomDestroy:房间被销毁的回调。
        /**
         * 房间被销毁的回调
         * @param channelId  频道号
         */
        void onRoomDestroy(String channelId);
  • onSDKError:SDK报错,需要销毁实例。
        /**
         * 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);
  • onUserVideoMuted:用户muteVideo通知。
    /**
         * 用户muteVideo通知
         * @param channelId  频道号
         */
        void onUserVideoMuted(String channelId,String userId, boolean mute);
  • onUserAudioMuted:用户muteAudio通知。
     /**
         * 用户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);