Flutter音视频通话插件cometchat_calls_sdk的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter音视频通话插件cometchat_calls_sdk的使用

一、概述

CometChat Calls SDK for Flutter 是一个强大的工具包,开发者可以利用它快速将可靠的、功能齐全的聊天和音视频通话功能集成到现有的或新的应用程序中。它消除了从零开始构建聊天基础设施的复杂性,从而加速开发过程并缩短上市时间。

二、前提条件

  • Flutter >=3.10.5
  • Dart >=3.0.5
  • Android Studio 2022.2
  • Android 7.0, API 24 及以上
  • Xcode 15
  • iOS 12.0

三、开始使用

要设置Flutter SDK并使用CometChat进行聊天和通话功能,您需要按照以下步骤操作:

1. 注册并创建应用

  • 在 CometChat Dashboard 注册以创建一个账户。
  • 登录后,创建一个新的应用。创建完成后,CometChat会生成一个Auth Key和App ID。请妥善保管这些凭据,因为稍后会用到它们。
  • 查看关键概念,了解CometChat的基本组件。
  • 参考集成步骤文档,将SDK集成到您的Flutter应用中。

四、完整示例Demo

import 'dart:math';
import 'package:cometchat_calls_sdk/cometchat_calls_sdk.dart';
import 'package:flutter/material.dart';

// 替换为您的App ID和Region
String appId = "YOUR_APP_ID"; 
String region = "YOUR_APP_REGION";

class CometChatCallsDemo extends StatefulWidget {
  const CometChatCallsDemo({Key? key}) : super(key: key);

  [@override](/user/override)
  State<CometChatCallsDemo> createState() => _CometChatCallsDemoState();
}

class _CometChatCallsDemoState extends State<CometChatCallsDemo>
    implements CometChatCallsEventsListener {
  String? sessionId;
  String? generateTokenResult;
  Widget? videoContainer;

  [@override](/user/override)
  void initState() {
    super.initState();
    initCometChatCallsSDK();
  }

  // 1. 初始化CometChatCalls SDK
  initCometChatCallsSDK() {
    CallAppSettings callAppSettings = (CallAppSettingBuilder()
          ..appId = appId
          ..region = region)
        .build();
    CometChatCalls.init(callAppSettings, onSuccess: (String successMessage) {
      debugPrint("Initialization completed successfully: $successMessage");
      generateToken(); // 成功初始化后生成Token
    }, onError: (CometChatCallsException e) {
      debugPrint("Initialization failed with exception: ${e.message}");
    });
  }

  // 2. 生成Token
  Future<void> generateToken() async {
    String? userAuthToken = ""; // 获取用户认证Token的方法:CometChat.getUserAuthToken()
    CometChatCalls.generateToken(generateNewSessionId(), userAuthToken,
        onSuccess: (GenerateToken generateToken) {
      debugPrint("generateToken success: ${generateToken.token}");
      startCall(generateToken.token!); // 生成Token成功后启动通话
    }, onError: (CometChatCallsException e) {
      debugPrint("generateToken Error: $e");
    });
  }

  // 3. 启动通话
  startCall(String generatedToken) async {
    // 可选设置
    MainVideoContainerSetting videoSettings = MainVideoContainerSetting();
    videoSettings.setMainVideoAspectRatio(VideoStreamsMode.ASPECT_RATIO_CONTAIN);
    videoSettings.setNameLabelParams(
        VideoStreamsPosition.POSITION_TOP_LEFT, true, "#000");
    videoSettings.setZoomButtonParams(
        VideoStreamsPosition.POSITION_TOP_RIGHT, true);
    videoSettings.setUserListButtonParams(
        VideoStreamsPosition.POSITION_TOP_RIGHT, true);
    videoSettings.setFullScreenButtonParams(
        VideoStreamsPosition.POSITION_TOP_RIGHT, true);

    // 通话设置构建器
    CallSettings callSettings = (CallSettingsBuilder()
          ..enableDefaultLayout = true
          ..setMainVideoContainerSetting = videoSettings
          ..listener = this)
        .build();

    // 启动通话
    CometChatCalls.startSession(generatedToken, callSettings,
        onSuccess: (Widget? callingWidget) {
      setState(() {
        videoContainer = callingWidget;
      });
    }, onError: (CometChatCallsException e) {
      debugPrint("Error: StartSession: $e");
    });
  }

  // 生成新的会话ID
  String generateNewSessionId() {
    return "${generateRandomString(4)}-${generateRandomString(4)}-${generateRandomString(4)}";
  }

  // 随机字符串生成器
  String generateRandomString(int len) {
    var r = Random();
    const chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz';
    return List.generate(len, (index) => chars[r.nextInt(chars.length)]).join();
  }

  // 通话回调方法
  [@override](/user/override)
  void onAudioModeChanged(List<AudioMode> devices) {
    debugPrint("onAudioModeChanged: ${devices.length}");
  }

  [@override](/user/override)
  void onCallEndButtonPressed() {
    debugPrint("onCallEndButtonPressed");
  }

  [@override](/user/override)
  void onCallEnded() {
    debugPrint("onCallEnded");
  }

  [@override](/user/override)
  void onCallSwitchedToVideo(CallSwitchRequestInfo info) {
    debugPrint("onCallSwitchedToVideo: ${info.requestAcceptedBy}");
  }

  [@override](/user/override)
  void onError(CometChatCallsException ce) {
    debugPrint("onError: ${ce.message}");
  }

  [@override](/user/override)
  void onRecordingToggled(RTCRecordingInfo info) {
    debugPrint("onRecordingToggled: ${info.user?.name}");
  }

  [@override](/user/override)
  void onUserJoined(RTCUser user) {
    debugPrint("onUserJoined: ${user.name}");
  }

  [@override](/user/override)
  void onUserLeft(RTCUser user) {
    debugPrint("onUserLeft: ${user.name}");
  }

  [@override](/user/override)
  void onUserListChanged(List<RTCUser> users) {
    debugPrint("onUserListChanged: ${users.length}");
  }

  [@override](/user/override)
  void onUserMuted(RTCMutedUser muteObj) {
    debugPrint("onUserMuted: ${muteObj.mutedBy}");
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: const Color(0xFF333333),
      body: SafeArea(
        child: videoContainer ??
            const Center(
              child: CircularProgressIndicator(
                color: Colors.white,
              ),
            ),
      ),
    );
  }
}

更多关于Flutter音视频通话插件cometchat_calls_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音视频通话插件cometchat_calls_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用cometchat_calls_sdk插件来实现音视频通话的一个基本示例。请注意,这只是一个简化的示例,实际应用中可能需要更多的错误处理和功能实现。

首先,确保你已经在pubspec.yaml文件中添加了cometchat_calls_sdk依赖:

dependencies:
  flutter:
    sdk: flutter
  cometchat_calls_sdk: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你需要初始化Cometchat SDK并配置音视频通话。以下是一个基本的示例代码:

main.dart

import 'package:flutter/material.dart';
import 'package:cometchat_calls_sdk/cometchat_calls_sdk.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Audio/Video Calls',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CallScreen(),
    );
  }
}

class CallScreen extends StatefulWidget {
  @override
  _CallScreenState createState() => _CallScreenState();
}

class _CallScreenState extends State<CallScreen> {
  CometChatCallManager? callManager;

  @override
  void initState() {
    super.initState();
    // 初始化CometChat SDK(请确保你已经设置好你的appId, authKey, region等)
    CometChat.init(CometChat.Configuration(
      appId: "YOUR_APP_ID",
      authKey: "YOUR_AUTH_KEY",
      region: "YOUR_REGION",
    )).then((_) async {
      // 初始化音视频通话管理器
      callManager = await CometChatCallManager.getInstance();
      
      // 监听来电事件
      callManager!.addListener(CometChatCallListener(
        onIncomingCall: (CometChatCall call) {
          // 处理来电,例如显示来电界面
          showDialog(
            context: context,
            builder: (context) {
              return AlertDialog(
                title: Text("Incoming Call"),
                content: Text("From: ${call.caller?.uid}"),
                actions: <Widget>[
                  TextButton(
                    child: Text("Accept"),
                    onPressed: () async {
                      Navigator.of(context).pop();
                      await call.accept();
                    },
                  ),
                  TextButton(
                    child: Text("Decline"),
                    onPressed: () async {
                      Navigator.of(context).pop();
                      await call.reject();
                    },
                  ),
                ],
              );
            },
          );
        },
        onCallEnded: (CometChatCall call) {
          // 处理通话结束事件
          print("Call ended with ${call.callEndReason}");
        },
      ));
    }).catchError((error) {
      print("Error initializing CometChat: $error");
    });
  }

  @override
  void dispose() {
    // 移除监听器
    callManager?.removeAllListeners();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio/Video Calls'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 发起音视频通话(替换为实际用户的UID)
            CometChatCall call = CometChatCall(
              caller: CometChatUser(uid: "YOUR_USER_ID"),
              callee: CometChatUser(uid: "RECEIVER_USER_ID"),
              callType: CometChatCallType.AUDIO, // 或者 CometChatCallType.VIDEO
            );
            await call.start();
          },
          child: Text('Start Call'),
        ),
      ),
    );
  }
}

注意事项:

  1. 权限设置:确保在AndroidManifest.xmlInfo.plist中添加了必要的音视频通话权限,如摄像头、麦克风等。
  2. 用户认证:在实际应用中,你需要在发起通话前确保用户已经登录并认证。
  3. UI设计:上述示例中的UI非常简单,实际应用中你可能需要设计更加复杂和友好的用户界面。
  4. 错误处理:示例代码中没有详细的错误处理逻辑,实际应用中你需要添加适当的错误处理来增强应用的健壮性。

请根据你的具体需求调整上述代码。

回到顶部