mlsdk_flutter 1.0.0-beta.1
mlsdk_flutter: ^1.0.0-beta.1 copied to clipboard
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();
})
);