Flutter视频通信插件cloudroomvideosdk的使用
Flutter视频通信插件cloudroomvideosdk的使用
cloudroom-video-sdk 是一款用于在 Flutter 应用中实现视频通信功能的插件。通过此插件,开发者可以轻松集成视频通话、屏幕共享等功能到自己的应用中。
使用步骤
以下是使用 cloudroomvideosdk 插件的基本步骤和完整示例代码。
1. 初始化插件
首先,确保在 main.dart
文件中初始化插件,并检查必要的权限。
import 'dart:async';
import 'dart:io';
import 'package:cloudroomvideosdk/cloudroomvideosdk.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:wakelock/wakelock.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:path_provider/path_provider.dart'
show getExternalStorageDirectory, getApplicationDocumentsDirectory;
import 'package:fluro/fluro.dart';
import 'application/routes.dart';
import 'application/application.dart';
import 'application/connectivitys.dart';
void main() {
// 强制竖屏
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);
runApp(App());
EasyLoading.instance
..maskColor = Colors.black.withOpacity(0.5)
..dismissOnTap = false;
}
class App extends StatefulWidget {
App({Key? key}) : super(key: key) {
final FluroRouter router = FluroRouter();
Routes.configureRoutes(router);
Application.router = router;
}
@override
State<App> createState() => _AppState();
}
class _AppState extends State<App>
with CrSDKNotifier, WidgetsBindingObserver, Connectivitys {
Size _designSize = const Size(375, 668);
@override
void initState() {
Wakelock.enable();
addCrNotifierListener([
NOTIFIER_EVENT.lineOff,
]);
connectivityInit();
WidgetsBinding.instance?.addObserver(this);
_getPermission();
super.initState();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
}
@override
void dispose() {
disposeCrNotifierListener();
connectivityDispose();
WidgetsBinding.instance?.removeObserver(this);
super.dispose();
}
@override
void didChangeMetrics() {
screenUtilInit();
super.didChangeMetrics();
}
@override
lineOff(int sdkErr) {
GlobalConfig.instance.loginStatus = LOGIN_STATUS.unlogin;
Application.emit("changeLoginStatus");
}
@override
void connectivityConnect() {
if (GlobalConfig.instance.initStatus != INIT_STATUS.init) {
sdkInit();
}
}
@override
void connectivityDisconnect() {
EasyLoading.showToast("没有网络");
}
_getPermission() async {
await getStoragePermission();
await getManageExternalStoragePermission();
await getCameraPermission();
await getMicrophonePermission();
}
// 检查存储权限 没有就去请求存储权限
Future<bool> getStoragePermission() async {
PermissionStatus storageStatus = await Permission.storage.status;
bool _isStoragePermissionGranted =
storageStatus == PermissionStatus.granted;
if (!_isStoragePermissionGranted) {
storageStatus = await Permission.storage.request();
}
return _isStoragePermissionGranted;
}
Future<bool> getManageExternalStoragePermission() async {
PermissionStatus manageExternalStatus =
await Permission.manageExternalStorage.status;
bool _isManageExternalPermissionGranted =
manageExternalStatus == PermissionStatus.granted;
if (!_isManageExternalPermissionGranted) {
manageExternalStatus = await Permission.manageExternalStorage.request();
}
return _isManageExternalPermissionGranted;
}
// 检查相机权限,没有就去请求相机权限
Future<bool> getCameraPermission() async {
PermissionStatus cameraStatus = await Permission.camera.status;
bool _isCameraPermissionGranted = cameraStatus == PermissionStatus.granted;
if (!_isCameraPermissionGranted) {
cameraStatus = await Permission.camera.request();
_isCameraPermissionGranted = cameraStatus == PermissionStatus.granted;
}
return _isCameraPermissionGranted;
}
// 检查麦克风权限,没有就去请求麦克风权限
Future<bool> getMicrophonePermission() async {
PermissionStatus microphoneStatus = await Permission.microphone.status;
bool _isMicrophonePermissionGranted =
microphoneStatus == PermissionStatus.granted;
if (!_isMicrophonePermissionGranted) {
microphoneStatus = await Permission.microphone.request();
_isMicrophonePermissionGranted =
microphoneStatus == PermissionStatus.granted;
}
return _isMicrophonePermissionGranted;
}
Future<String> _getStorageDirectory() {
if (Platform.isIOS) {
return getApplicationDocumentsDirectory()
.then((Directory? dir) => dir?.path ?? "");
}
return getExternalStorageDirectory().then((Directory? dir) {
String? path = dir?.path;
String dirPath =
path != null ? path.split("/").sublist(0, 4).join("/") : "";
return "$dirPath/CloudroomFlutter";
});
}
sdkInit() async {
final String path = await _getStorageDirectory();
GlobalConfig.instance.sdkDatSavePath = path;
CrSdkInitDat sdkInitDat =
CrSdkInitDat(sdkDatSavePath: path, noCall: true, noQueue: true);
final sdkErr = await CrSDK.instance.init(sdkInitDat);
if (sdkErr == 0) {
GlobalConfig.instance.initStatus = INIT_STATUS.init;
await CrSDK.instance.setServerAddr(GlobalConfig.instance.serverAddr);
}
}
screenUtilInit() {
if (!mounted) return;
Size? size = WidgetsBinding.instance?.window.physicalSize;
double? physicalSizeWidth = size?.width;
double? physicalSizeHeight = size?.height;
if (physicalSizeWidth != null && physicalSizeHeight != null) {
final bool isVertical =
physicalSizeHeight.toInt() > physicalSizeWidth.toInt();
setState(() {
_designSize = isVertical ? const Size(375, 668) : const Size(668, 375);
});
}
}
@override
Widget build(BuildContext context) {
return ScreenUtilInit(
designSize: _designSize,
builder: () =>
MaterialApp(
title: 'CloudRoom',
theme: ThemeData(
brightness: Brightness.light,
primaryColor: Colors.white,
appBarTheme: const AppBarTheme(
centerTitle: true,
color: Colors.white,
titleTextStyle: TextStyle(color: Colors.black, fontSize: 18),
shadowColor: Colors.transparent,
iconTheme: IconThemeData(color: Colors.black),
),
),
initialRoute: '/',
onGenerateRoute: Application.router.generator,
builder: EasyLoading.init(),
));
}
}
2. 配置权限
在 Android 和 iOS 平台上,需要配置相应的权限。例如,在 AndroidManifest.xml
中添加以下权限:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
在 iOS 的 Info.plist
文件中添加以下权限描述:
<key>NSCameraUsageDescription</key>
<string>我们需要访问您的摄像头</string>
<key>NSMicrophoneUsageDescription</key>
<string>我们需要访问您的麦克风</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>我们需要访问您的相册</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>我们需要访问您的相册</string>
3. 调用视频通信功能
完成初始化后,可以通过调用插件提供的 API 来实现视频通信功能。例如,创建一个按钮来启动视频通话:
ElevatedButton(
onPressed: () {
CrSDK.instance.call();
},
child: Text('开始视频通话'),
),
更多关于Flutter视频通信插件cloudroomvideosdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter视频通信插件cloudroomvideosdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
CloudroomVideoSDK
是一个用于实现视频通信的 Flutter 插件,通常用于构建实时音视频通信应用。下面是如何在 Flutter 项目中使用 cloudroomvideosdk
插件的基本步骤。
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 cloudroomvideosdk
插件的依赖:
dependencies:
flutter:
sdk: flutter
cloudroomvideosdk: ^版本号
请确保将 ^版本号
替换为最新的插件版本。
2. 导入插件
在需要使用 CloudroomVideoSDK
的 Dart 文件中导入插件:
import 'package:cloudroomvideosdk/cloudroomvideosdk.dart';
3. 初始化 SDK
在使用 SDK 之前,需要先进行初始化:
void initializeSDK() async {
bool result = await CloudroomVideoSDK.initSDK();
if (result) {
print("SDK 初始化成功");
} else {
print("SDK 初始化失败");
}
}
4. 登录
初始化成功后,可以调用登录接口进行登录:
void login() async {
String server = "your_server_address";
String appId = "your_app_id";
String userId = "your_user_id";
String userPwd = "your_user_password";
int result = await CloudroomVideoSDK.login(server, appId, userId, userPwd);
if (result == 0) {
print("登录成功");
} else {
print("登录失败");
}
}
5. 创建或加入房间
登录成功后,可以创建或加入一个视频房间:
void createOrJoinRoom() async {
String roomId = "your_room_id";
String userNickName = "your_nickname";
int result = await CloudroomVideoSDK.createOrJoinRoom(roomId, userNickName);
if (result == 0) {
print("创建或加入房间成功");
} else {
print("创建或加入房间失败");
}
}
6. 处理视频流
在房间中,你可以处理视频流。例如,显示本地和远程视频:
void setupVideo() async {
// 设置本地视频视图
await CloudroomVideoSDK.setupLocalVideoView(localVideoViewId);
// 设置远程视频视图
await CloudroomVideoSDK.setupRemoteVideoView(remoteVideoViewId);
// 开始本地视频预览
await CloudroomVideoSDK.startLocalVideoPreview();
// 订阅远程视频流
await CloudroomVideoSDK.subscribeRemoteVideo(userId);
}
7. 处理事件
你可能需要监听一些事件,例如房间状态变化、用户加入或离开等:
void setupEventListeners() {
CloudroomVideoSDK.onRoomStateChanged.listen((state) {
print("房间状态变化: $state");
});
CloudroomVideoSDK.onUserJoined.listen((userId) {
print("用户加入: $userId");
});
CloudroomVideoSDK.onUserLeft.listen((userId) {
print("用户离开: $userId");
});
}
8. 退出房间和注销
在视频通信结束后,记得退出房间并注销:
void leaveRoomAndLogout() async {
await CloudroomVideoSDK.leaveRoom();
await CloudroomVideoSDK.logout();
}
9. 释放资源
在应用退出时,释放 SDK 占用的资源:
void dispose() async {
await CloudroomVideoSDK.uninitSDK();
}