Android RTCLib SDK 开发指南

    开通方式

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

    工程准备

    注:以 Android Studio 为例说明如何将 RongRTC SDK 导入到您的工程

    • 新建项目:将项目结构由 Android 改成 Project,如图:
    image

    添加相应的应用权限

    将 Manifest_permissions.txt 中的代码复制到您新建工程的 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" />
    

    引入必要 jar 包

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

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

    引入 so 库文件

    • 方法 A:复制 lib_RongRTC_so.so到app/src/main/jniLibs/armeabi-v7a 下
    jniLibs:
        armeabi-v7a
            lib_RongRTC_so.so
    RongRTCLib_2.1.0.jar
    
    • 方法 B:复制 lib_RongRTC_so.so 到 app/libs/armeabi-v7a 下,并配置 gradle
    sourceSets.main {
            res.srcDir=['res']
            jniLibs.srcDir=['libs']
        }
    

    初始化 SDK

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

        cmpServer 默认地址:rtccmp.ronghub.com:80;
      
    • 获取 RTCToken:

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

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

        服务地址 : https://rtcapi.ronghub.com/voiptoken;
    

    以 GET/POST 方式获取 Token,示例代码下:

    需要注意的是,获取 RTCToken 需要在发起音视频操作 (joinChannel) 之前进行,以下为代码示例(此处启用新的 Thread 是因为获取 RTCToken 是耗时网络请求,不允许放到主线程中)

    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) {
                }
            });
    
    • 加入会议室,首先设置视频通话的参数(也可不设置,全部使用默认值):
    Map<String, Object> parameters = new HashMap<String, Object>();
    //具体ParameterKey以及详细说明请请参考Api文档。
    parameters.put(RongRTCEngine.ParameterKey.KEY_IS_SRTP_USED,true);
    RongRTCEngine.getInstance().setVideoParameters(parameters);
    

    然后调用 joinChannel 方法,加入聊天室:

    RongRTCEngine.getInstance().joinChannel(deviceId, userName, token, channelID);
    
    • 创建本地视频视图,调用 setLocalVideoView 创建本地视频视图(此方法的调用时机放到初始化窗口视图或是 join channel 之后都可以):
    RongRTCVideoView localSurface = RongRTCEngine.createVideoView(getApplicationContext());
    //创建好的view传递到RongRTCEngine中。RongRTCEngine会把相应的视频加载到此视图中
    RongRTCEngine.getInstance().setLocalVideoView(localSurface);
    
    • 创建远程视频视图,调用 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));
          }
    
    • 结束通话,调用 leaveChannel 方法退出,否则下次无法正常加入聊天室
    RongRTCEngine.getInstance().leaveChannel();
    

    白板功能

    请求白板 URL

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

    白板 URL 异步返回

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

    添加代码混淆

    • 如果你项目启用了代码混淆,请在 proguard-rules.pro 中添加 SDK 的混淆规则
    -keep class cn.rongcloud.rtc.core.**  { *; }
    -keep class cn.rongcloud.rtc.engine.binstack.json.**  { *; }