Android RTCLib SDK 开发指南

    开通方式

    音视频服务开通,请参考音视频开通方式说明。

    准备工作

    1、下载 RTCLib SDK 下载地址

    2、环境准备

    操作系统 开发工具
    Android 4.3 及以上 Android Studio

    集成使用

    1、将待集成的项目结构视图模式由 Android 改成 Project

    2、添加权限,将如下权限添加到 AndroidManifest.xml

        <uses-permission android:name="android.permission.CAMERA" />
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
        <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.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.READ_LOGS" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    

    3、复制 RongRTCLib_x.x.x.jar 到 app/libs 目录下,并加入到 Dependencies 中。

    dependencies {
        compile files('libs/RongRTCLib_2.1.0.jar')
    }
    

    4、复制 lib_RongRTC_so.so 到 app/libs/armeabi-v7a 下,并配置 gradle

    sourceSets.main {
            res.srcDir=['res']
            jniLibs.srcDir=['libs']
        }
    

    RongRTC 音视频通话流程

    image

    初始化 SDK

    1、在整个应用程序全局,您只需要调用一次 RongRTCEngine.init(getApplicationContext(),cmpServer) 方法。对于快速集成,我们建议您在主页面的 onCreate 方法中初始化。

      cmpServer 默认地址:rtccmp.ronghub.com:80
    

    2、获取 RTCToken。

    • RTCToken 的主要作用是身份授权和安全,因此不能通过客户端直接访问融云服务器获取 RTCToken,您必须通过 Server API 从融云服务器获取 RTCToken 返回给您的 App,并在之后连接时使用。详细请参考 Server 开发指南

    • 根据 uid(客户端自定义的用户唯一标识,Demo 中以 DeviceId 代替) 和 APPID 获取 RTCToken。APPID 为融云开发者后台 AppKey, 服务地址如下。

        服务地址 : https://rtcapi.ronghub.com/voiptoken
    
    • GET/POST 方式获取 Token,示例代码下:
    private void logonToServer() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    String deviceId="";
                    deviceId= getDeviceId();
                    if (TextUtils.isEmpty(deviceId))
                        deviceId = RongRTCSessionManager.getInstance().getString(RongRTCContext.BLINK_UUID);
                    final String token = RongRTCHttpClient.getInstance().doPost(serverURL, "uid=" + deviceId + "&appid=" + AppKey);
                    if (TextUtils.isEmpty(token) || TextUtils.isEmpty(deviceId)) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                showToastLengthLong("获取token/deviceID失败,请重新尝试!");
                                CallActivity.this.finish();
                            }
                        });
                        return;
                    }
                    RongRTCEngine.getInstance().joinChannel(deviceId, iUserName, token, channelID);
                }
            }).start();
        }
    
    private String getDeviceId() {
            String deviceId = "";
            try {
                TelephonyManager TelephonyMgr = (TelephonyManager) getSystemService(Activity.TELEPHONY_SERVICE);
                deviceId = TelephonyMgr.getDeviceId();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return deviceId;
        }
    

    音视频通话

    设置回调

    建议在音视频页面初始化的地方实现回调方法(调用 setRongRTCEngineEventHandler 方法),代码示例如下。

    RongRTCEngine.getInstance().setRongRTCEngineEventHandler(new RongRTCEngineEventHandler() {
                @Override
                public void onConnectionStateChanged(int i) {
                }
    
                @Override
                public void onLeaveComplete(boolean b) {
                }
    
                @Override
                public void onUserJoined(String s, String s1, RongRTCEngine.UserType userType, long l, int i) {
                }
    
                @Override
                public void onNotifyUserVideoCreated(String s, String s1, RongRTCEngine.UserType userType, long l, int i) {
                }
    
                @Override
                public void onUserLeft(String s) {
                }
    
                @Override
                public void OnNotifyUserVideoDestroyed(String s) {
                }
    
                @Override
                public void onWhiteBoardURL(String s) {
                }
    
                @Override
                public void onNetworkSentLost(int i) {
                }
    
                @Override
                public void onNetworkReceiveLost(int i) {
                }
    
                @Override
                public int onTextureFrameCaptured(int i, int i1, int i2) {
                    return 0;
                }
    
                @Override
                public void onControlAudioVideoDevice(int i) {
                }
    
                @Override
                public void onNotifyControlAudioVideoDevice(String s, RongRTCEngine.RongRTCDeviceType rongRTCDeviceType, boolean b) {
                }
    
                @Override
                public void onNotifyCreateWhiteBoard(String s) {
                }
    
                @Override
                public void onNotifySharingScreen(String s, boolean b) {
                }
            });
    

    加入音视频

    1、首先设置视频通话的参数(也可不设置,全部使用默认值)。

    Map<String, Object> parameters = new HashMap<String, Object>();
    //具体ParameterKey以及详细说明请请参考Api文档。
    parameters.put(RongRTCEngine.ParameterKey.KEY_IS_SRTP_USED,true);
    RongRTCEngine.getInstance().setVideoParameters(parameters);
    

    2、 然后调用 joinChannel 方法,加入聊天室。

    RongRTCEngine.getInstance().joinChannel(deviceId, userName, token, channelID);
    

    创建视图

    1、创建本地视频视图,调用 setLocalVideoView 创建本地视频视图(此方法的调用时机放到初始化窗口视图或是 join channel 之后都可以)。

    RongRTCVideoView localSurface = RongRTCEngine.createVideoView(getApplicationContext());
    //创建好的view传递到RongRTCEngine中。RongRTCEngine会把相应的视频加载到此视图中
    RongRTCEngine.getInstance().setLocalVideoView(localSurface);
    

    2、创建远程视频视图,调用 setRemoteVideoView 创建本地视频视图 当有远端用户加入时,监听器 RongRTCEngineEventHandler 相应方法会被回调,此时需要在回调方法中设置远程视频视图。

    @Override
          public void onNotifyUserVideoCreated(String userId, String userName, RongRTCEngine.UserType type, long talkType, int screenSharingStatus) {
        //使用RongRTCEngine提供的方法创建RongRTCVideoView
              RongRTCVideoView remoteView = RongRTCEngine.createVideoView(CallActivity.this.getApplicationContext());
        //创建好的view传递到RongRTCEngine中。RongRTCEngine会把相应的视频加载到此视图中
                 RongRTCEngine.getInstance().setRemoteVideoView(remoteView, userId);
        //把持有视频的视图加入到本地UI中去
              renderViewManager.setVideoView(false,userId,userName, remoteView, userJoinTaikType(talkType));
          }
    

    退出会话

    如果需要退出该音视频会话,调用下面的方法来正常退出,其他端收到远端用户离开的回调时需要做视图移除和 UI 调整相关逻辑处理

    RongRTCEngine.getInstance().leaveChannel();
    

    收到其他端离开会话的回调 RongRTCEngineEventHandler 中方法如下:

    public void onUserLeft(String s)
    

    白板功能

    音视频会议提供白板的功能,App 如果需要使用白板的功能时可以使用下面方法,注:白板功能的发起目前只能在 Web 端进行,其他端只能昨为接收端,另外白板的功能使用 html 的页面进行展现,App 需要获取白板的 URL 地址,然后将 html 的页面加载到 WebView 中即可。

    获取白板地址

    1、App 需要先调用 RongRTCEngine 的 requestWhiteBoardURL 请求白板地址的方法

    /**
        * 请求白板页面 HTTP URL, 自己已在聊天室中且聊天室中至少还有一个远程用户,
        * 在请求之后会异步通过回调中的{@link BlinkEngineEventHandler#onWhiteBoardURL(String)}方法返回白板页面的URL
        */
        public void requestWhiteBoardURL()
    

    此时如果有人已经发起白板直播,会通过下面方法进行回调

    /**
      * 自己已在聊天室中且聊天室中至少还有一个远程用户, {@link BlinkEngine#requestWhiteBoardURL()} 请求白板页面的HTTP URL之后的回调
      *
      * @param url 白板页面的url
      */
    public abstract void onWhiteBoardURL(String url);
    

    2、将上面回调方法中的 url 放到一个 WebView 中进行展示即可,此时白板功能创建完成