mlsdk_flutter 1.0.0-beta.1 copy "mlsdk_flutter: ^1.0.0-beta.1" to clipboard
mlsdk_flutter: ^1.0.0-beta.1 copied to clipboard

discontinued
outdated

Mindlinker meeting Flutter plugin project.

[toc]

mlsdk_flutter #

A new Flutter plugin project.

初始化SDK #

功能介绍 #

SDK 初始化调用 MlsdkFlutter.init(option) 就可以进行 sdk 的初始化。

示例代码 #

Future<MLResult> initMLSdk() async{
    MLOption option = MLOption(Constrant.serverUrl, Constrant.logPath,
    enableConsoleLog: true, enableLog: true);
    return MlsdkFlutter.init(option);
}

参数说明 #

参数名称 参数类型 是否必填 参数描述
serverUrl String 服务器地址,即在迈聆开放平台申请的房间服务器地址
enableConsoleLog Boolean 是否在控制台输出日志打印
enableLog Boolean 是否开启日志
logPath String 本地日志保存路径,只有enableLog为true的情况下,才会进行日志的写入

返回值 #

MLResult 创建会议结果回调

参数名称 参数类型 参数描述
code int 返回码 0-成功;-1:未知错误码;
message String 错误信息

获取AuthCode #

功能介绍 #

AuthCode 根据 JWT 协议生成的,后续 登录授权 需要传给 MlsdkFlutter.authenticate,目的是为了校验 APP 的身份,了解 AuthCode

示例代码 #

::: warning 以下获取的 Jwt Token 是为了方便客户端在测试阶段方便调试使用,正式使用时建议从后台生成后获取 :::

dependencies:
    dart_jsonwebtoken: ^2.4.2 // 快速生成 jwt token 依赖库
    // todo: 正式版的话,为了安全起见,appkey 和 appSecret 是保存在后台服务器的,这个 AuthCode 是由后台返回给到客户端的,
//  客户端这边拿到 authCode 之后传给 MlsdkFlutter.authenticate,进行账号登录和验证
class AuthCode {

    static String getAuthCode(String nickname, String avatar, String openId) {
        return hs256(nickname, avatar, openId);
    }

    static String hs256(String nickname, String avatar, String openId) {
        String token;

        final jwt = JWT({
            'appKey': Constrant.appKey,
            'userInfo': {
            'nickname': nickname,
            'avatar': avatar,
            'openId': openId,
        }
        });

        // Sign it
        token = jwt.sign(SecretKey(Constrant.appSecret));
        print('AuthCode Signed token: $token\n');
        return token;
    }
}

登录授权 #

功能介绍 #

在完成 初始化 SDK 调用和 获取 AuthCode 后需要进行 sdk 登录授权,授权成功后就可以创建会议和加入会议了,具体调用如下 Api MlsdkFlutter.authenticate 进行

Future<AuthenticateResult> authenticate(String authCode, String nickName, String avatar) async

示例代码 #

  Future<void> authience() async {
    SmartDialog.showLoading();
    _deviceDetails()
        .then((value) => AuthCode.getAuthCode(_textFieldName, "", _identifier))     // 获取 AuthCode
    .then((authCode) => MlsdkFlutter.authenticate(authCode, _textFieldName, ""))    // 授权登录
    .then((result) => {
    if(result.code == 0) {  // 授权成功
        Navigator.of(context).pushNamed(homePage, arguments: _textFieldName),
        Fluttertoast.showToast(msg: "authience success")
    } else {              // 授权失败
        Fluttertoast.showToast(msg: "code=${result.code} msg=${result.message}")
    }
  }).whenComplete(() => {
    SmartDialog.dismiss()
  });

}

参数说明 #

参数名称 参数类型 是否必填 参数描述
authCode String AuthCode,根据 jwt 协议生成
nickName String 用户名称
avatar String 用户头像

返回值 #

AuthenticateResult

参数名称 参数类型 参数描述
code int 返回码 0-成功 -1:未知错误码
message String 错误信息
accessToken String AccessToken 授权码

创建会议 #

功能介绍 #

创建会议,使用 Api 是:MlsdkFlutter.createMeeting(),结果回调:MeetingResult

Future<MeetingResult> createMeeting(
    String nickName, 
    String avatar,
    {String topic = ""}) async

示例代码 #

  Future<void> createMeeting(CreateMeetingCallback onSuccess) async {
    SmartDialog.showLoading();
    MeetingResult result = await MlsdkFlutter.createMeeting(_nickName, "")
        .whenComplete(() => SmartDialog.dismiss());
    MeetingRoom? meetingRoom = result.meetingRoom;
    if(result.code == 0 || result.code == 9997) {
      if(result.meetingRoom != null) {
        onSuccess.call(result.meetingRoom!);
      }
    } else if(result.code == 403103014) {
      // 会议室已经存在
      Fluttertoast.showToast(msg: "会议室已经存在");
      if(meetingRoom != null) {
        showJoinDialog(meetingRoom.roomNo, meetingRoom.sessionId, onSuccess);
      }
    }
  }

参数说明 #

MlsdkFlutter.createMeeting

参数名称 参数类型 是否必填 参数描述
nickName String 入会用户名称
avatar String 用户头像
topic String 房间名称

返回值 #

MeetingResult 创建会议结果回调

参数名称 参数类型 参数描述
code int 返回码 0-成功;9997-已经在房间中;403103014-会议室已经存在;-1:未知错误码;
message String 错误信息
meetingRoom MeetingRoom 会议房间信息

会议房间信息:MeetingRoom

参数名称 参数类型 参数描述
sessionId String sessionId,房间的唯一标识
roomNo String 房间号
password String 房间密码
isRejoin Boolean 成员是否重新加入房间,默认为 false

加入会议 #

功能介绍 #

创建会议,使用 Api 是:MlsdkFlutter.joinMeeting(),结果回调:MeetingResult

Future<MeetingResult> joinMeeting(
    String meetingNo,
    String nickName, 
    String avatar,
    {String password = ""}) async

示例代码 #

    Future<void> joinMeetingRoom(JoinMeetingCallback onSuccess) async {
      if (_meetingNo.isEmpty) {
        Fluttertoast.showToast(msg: "会议号不能为空");
        return;
      }
    
      if (_nickName.isEmpty) {
        Fluttertoast.showToast(msg: "用户名称不能为空");
        return;
      }
    
      SmartDialog.showLoading();
      MeetingResult result = await MlsdkFlutter.joinMeeting(
          _meetingNo, _nickName, "",)
          .whenComplete(() => SmartDialog.dismiss());
    
      if(result.code == 0 || result.code == 9997) {
        if(result.meetingRoom != null) {
          onSuccess.call(result.meetingRoom!);
        }
      }
    }


参数说明 #

MlsdkFlutter.joinMeeting

参数名称 参数类型 是否必填 参数描述
meetingNo String 房间号
nickName String 入会用户名称
avatar String 用户头像
password String 入会密码

返回值 #

MeetingResult 加入会议结果回调

参数名称 参数类型 参数描述
code int 返回码 0-成功;9997-已经在房间中;403103014-会议室已经存在;-1:未知错误码;
message String 错误信息
meetingRoom MeetingRoom 会议房间信息

会议房间信息:MeetingRoom

参数名称 参数类型 参数描述
sessionId String sessionId,房间的唯一标识
roomNo String 房间号
password String 房间密码
isRejoin Boolean 成员是否重新加入房间,默认为 false

MLSurfaceview #

功能介绍 #

作为 PlatformView 的 Widget,MLSurfaceView 接收三个参数,分别为:uuid、isLocal、createdCallback,负责渲染本地预览视频和远程视频,其中 createdCallback 作为 MLSurfaceView 创建成功的回调,会返回一个 MLSurfaceviewController 可以用户订阅视频和取消订阅

示例代码 #

  // 本地预览视频(自己)
  Widget getLocalWidget() {
    return MLSurfaceview(
      "",
      true,
      createdCallback: (MLSurfaceviewController controller) {
        _localController?.unsubscribeVideo();
        controller.subscribeVideo();
        setState(() {
          _localController = controller;
        });
      },
    );
  }
  
  // 远程预览视频(他人)
  Widget getRemoteWidget() {
    if (_otherUuid.isEmpty) {
      return Container();
    }

    return MLSurfaceview(
      _otherUuid,
      false,
      createdCallback: (MLSurfaceviewController controller) {
        _remoteController?.unsubscribeVideo();
        controller.subscribeVideo();
        setState(() {
          _remoteController = controller;
        });
      },
    );
  }

  Widget showPlatformView() {
    return Container(
      color: Colors.black,
      child: _otherUuid.isEmpty
          ? getLocalWidget()
          : Stack(
        alignment: AlignmentDirectional.topEnd,
        children: <Widget>[
          getRemoteWidget(),
          Container(
            margin: const EdgeInsets.only(right: 20, top: 20),
            child: SizedBox(
              width: 150,
              height: 190,
              child: Container(
                child: getLocalWidget(),
              ),
            ),
          )

        ],
      ),
    );
  }

参数说明 #

参数名称 参数类型 是否必填 参数描述
uuid String 用户 uuid
isLocal bool 是否为本地视频;true:本地视频(自己);false:远程视频(他人)
createdCallback MLSurfaceViewCreatedCallback MLSurfaceView 创建成功回调,会返回一个 MLSurfaceviewController
  • MLSurfaceviewController
    • subscribeVideo:订阅视频
    • unsubscribeVideo:取消订阅

退出会议 #

功能介绍 #

离开会议,可以调用 MlsdkFlutter.quitMeeting(), sessionId 为房间的唯一标识符,创建房间或者加入房间成功后会返回该参数。

Future<MLResult> quitMeeting(String sessionId) async

示例代码 #

    // 弹出对话框
    Future<bool?> showQuitDialog() async {
      return showDialog(
        context: context,
        builder: (context) {
          return WillPopScope(
              child: Material(
                type: MaterialType.transparency,
                child: Center(
                  child: AlertDialog(
                    title: const Text("温馨提示"),
                    content: const Text("离开房间"),
                    actions: <Widget>[
                      TextButton(
                        child: const Text("否"),
                        onPressed: () =>
                            Navigator.of(context).pop(false), // 关闭对话框
                      ),
                      TextButton(
                        child: const Text("是"),
                        onPressed: () {
                          MlsdkFlutter.quitMeeting(_meetingRoom.sessionId!);
                          _localController?.unsubscribeVideo();
                          //关闭对话框并返回true
                          Navigator.of(context).pop(true);
                        },
                      ),
                    ],
                  ),
                ),
              ),
              onWillPop: () async => false);
        },
      );
    }

参数说明 #

参数名称 参数类型 是否必填 参数描述
sessionId String sessionId,房间的唯一标识

返回值 #

MLResult 退出会议结果回调

参数名称 参数类型 参数描述
code int 返回码 0-成功;-1:未知错误码;
message String 错误信息

获取参会人列表 #

功能介绍 #

获取参会人列表,可以调用 MlsdkFlutter.getMeetingMembers(), 需要在创建会议/进入会议成功之后调用,否则返回空列表

Future<List<Member>> getMeetingMembers() async

示例代码 #

    _initData() async {
      members = await MlsdkFlutter.getMeetingMembers();
      var list1 = members.where((element) => element.isSelf);
      if (list1.isNotEmpty) {
        setState(() {
          uuid = list1.first.uid;
        });
      }
      var list2 = members.where((element) => !element.isSelf);
      if (list2.isNotEmpty) {
        setState(() {
          _otherUuid = list2.first.uid;
        });
      }
    }

参数说明 #

返回值 #

Member 参会人信息

参数名称 参数类型 参数描述
uid String 参会人 uid
name String 昵称
avatar String 头像
userId String 参会人用户 id
isSelf bool 是否为用户本人

会议状态监听 #

功能介绍 #

创建会议/加入会议成功之后,可以调用 MlsdkFlutter.onMeetingStateListener() 监听用户入会、用户例会已经会议结束的状态

static onMeetingStateListener(
      {required UserJoinCallback userJoinCallback,
        required UserLeaveCallback? userLeaveCallback,
        required MeetingEndCallback? meetingEndCallback});

typedef UserJoinCallback = void Function(Member room);        // 用户入会
typedef UserLeaveCallback = void Function(Member room);       // 用户离会
typedef MeetingEndCallback = void Function(String meetingNo); // 会议结束

示例代码 #

    MlsdkFlutter.onMeetingStateListener(
        userJoinCallback: (member) {
          if (!member.isSelf) {
            setState(() {
              _otherUuid = member.uid;
            });
            Fluttertoast.showToast(msg: "${member.name} 加入会议");
          }
        }, userLeaveCallback: (member) {
          if (!member.isSelf) {
            setState(() {
              _otherUuid = "";
            });
          }
          Fluttertoast.showToast(msg: "${member.name} 离开会议");
        }, meetingEndCallback: ((meetingNo) {
          Fluttertoast.showToast(msg: "$meetingNo 会议已结束");
          Navigator.of(context).pop();
        })
    );