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

1 回复

更多关于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();
}
回到顶部