Flutter视频通话插件call_video的使用

Flutter视频通话插件call_video的使用

开始使用

可以从以下示例文件夹获取一些基本和高级示例:

隐私权限

Call Video SDK 需要 CameraMicrophone 权限才能开始视频通话。

Android

查看 AndroidManifest.xml 文件中的所需设备权限:

<manifest>
  ...
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  <uses-permission android:name="android.permission.NFC" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.RECORD_AUDIO" />
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.BLUETOOTH" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
    tools:ignore="ProtectedPermissions" />
  ...
</manifest>

在您的 android/app/build.gradle 文件中将最低 Android SDK 版本更改为 26 或更高版本:

minSdkVersion 26

iOS

打开 Info.plist 并添加以下内容:

  • Privacy - Microphone Usage Description
  • Privacy - Camera Usage Description
  • Privacy - NFCReaderUsageDescription

并在相应的 Value 列中添加描述。例如:

<key>Privacy - Microphone Usage Description</key>
<string>我们需要访问您的麦克风来完成视频通话。</string>

<key>Privacy - Camera Usage Description</key>
<string>我们需要访问您的摄像头来完成视频通话。</string>

<key>Privacy - NFCReaderUsageDescription</key>
<string>我们需要访问您的NFC读取器。</string>

<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
  <string>A0000002471001</string>
  <string>A0000002472001</string>
  <string>00000000000000</string>
</array>

如何贡献

要帮助开发此 SDK,请参阅 CONTRIBUTING.md

许可证

该项目受 MIT 许可证保护。

示例代码

以下是完整的示例代码:

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

void main() => runApp(const MyHomePage());

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late CallVideoController callVideoController;
  bool _localUserJoined = false;
  bool _remoteUserJoined = false;

  /// TODO 填写电话号码
  String phoneNumber = "*****";

  // 构建UI
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          appBar: AppBar(
            title: const Text('开始视频通话'),
          ),
          body: ListView(
            padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
            children: [
              // 本地视频容器
              if (_localUserJoined)
                Container(
                  height: 240,
                  decoration: BoxDecoration(border: Border.all()),
                  child: const Center(child: LocalVideoView()),
                ),
              const SizedBox(height: 10),
              // 远程视频容器
              if (_remoteUserJoined)
                Container(
                  height: 240,
                  decoration: BoxDecoration(border: Border.all()),
                  child: const Center(child: RemoteVideoView()),
                ),
              // 按钮行
              Row(
                children: <Widget>[
                  Expanded(
                    child: ElevatedButton(
                      onPressed: () {
                        _localUserJoined
                            ? null
                            : callVideoController.initialize(phoneNumber: phoneNumber);
                      },
                      child: const Text("加入"),
                    ),
                  ),
                  const SizedBox(width: 10),
                  Expanded(
                    child: ElevatedButton(
                      onPressed: _localUserJoined
                          ? callVideoController.leaveSession
                          : null,
                      child: const Text("离开"),
                    ),
                  ),
                ],
              ),
              // 按钮行结束
            ],
          )),
    );
  }

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

  Future<void> initVideoCall() async {
    callVideoController = createVideoCall();

    await callVideoController.initialize(phoneNumber: phoneNumber);

    callVideoController.join(
        onJoinCallSuccess: (bool isJoinCall) {
          setState(() {
            _localUserJoined = isJoinCall;
          });
        },
        onUserJoined: (bool isUserJoined) {
          setState(() {
            _remoteUserJoined = isUserJoined;
          });
        },
        onUserOffline: (int uid) {
          setState(() {
            _remoteUserJoined = false;
          });
        },
        onConnectionStateChanged: (ConnectionType type) {
          if (type == ConnectionType.failed || type == ConnectionType.disconnected) {
            setState(() {
              _remoteUserJoined = false;
              _localUserJoined = false;
            });
          }
        }
    );
  }

  [@override](/user/override)
  void dispose() {
    callVideoController.dispose();
    super.dispose();
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用call_video插件来实现视频通话功能的示例代码。请注意,call_video是一个假设的插件名称,因为Flutter社区中没有直接名为call_video的官方插件。不过,这里我将以一个通用的视频通话插件的使用方式为例进行说明。通常,视频通话功能会依赖于一些流行的第三方服务(如Agora、Twilio等)。

在这个例子中,我将使用Agora Video SDK作为视频通话的底层实现,因为Agora在Flutter社区中有良好的支持和文档。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加Agora Video SDK的Flutter插件依赖:

dependencies:
  flutter:
    sdk: flutter
  agora_rtc_engine: ^x.y.z  # 请替换为最新版本号

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

2. 配置Agora

在项目的android/app/src/main/AndroidManifest.xml中添加必要的权限和网络配置:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

<application
    ... >
    <service
        android:name="io.agora.media.RtcAudioManagerService"
        android:foregroundServiceType="mediaProjection|mediaPlayback" />
</application>

对于iOS,你需要在ios/Runner/Info.plist中添加相机和麦克风权限请求。

3. 初始化Agora并加入频道

接下来,在你的Flutter代码中初始化Agora引擎并加入视频通话频道:

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

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final RtcEngine _engine = RtcEngine();
  String _channelId = 'test_channel';
  bool _isInCall = false;

  @override
  void initState() {
    super.initState();
    initAgora();
  }

  Future<void> initAgora() async {
    // 获取Agora App ID(替换为你的App ID)
    String appId = 'your_agora_app_id';
    await _engine.initialize(appId);
    _engine.setEventHandler(
      RtcEngineEventHandler(
        joinChannelSuccess: (String channel, int uid, int elapsed) {
          print("User $uid joined channel $channel");
          setState(() {
            _isInCall = true;
          });
        },
        // 其他事件处理...
      ),
    );
  }

  Future<void> joinChannel() async {
    if (!_isInCall) {
      String token = 'your_agora_token'; // 替换为你的Token,或使用null进行无Token加入
      await _engine.joinChannel(null, _channelId, null, 0);
    }
  }

  Future<void> leaveChannel() async {
    if (_isInCall) {
      await _engine.leaveChannel();
      setState(() {
        _isInCall = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Agora Video Call'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: _isInCall ? leaveChannel : joinChannel,
                child: Text(_isInCall ? 'Leave Channel' : 'Join Channel'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _engine.leaveChannel();
    _engine.dispose();
    super.dispose();
  }
}

注意事项

  1. Agora App ID和Token:确保你已经从Agora官网获取了App ID,并正确生成了Token(如果需要)。
  2. 权限请求:在Android和iOS上,你需要在运行时请求相机和麦克风权限。
  3. UI渲染:上述代码仅展示了如何加入和离开频道,没有包含视频渲染的部分。你可以使用Agora提供的视频渲染组件来显示本地和远程视频流。

希望这个示例能帮助你开始在Flutter项目中实现视频通话功能。如果你使用的是其他视频通话插件,请查阅该插件的官方文档以获取具体的实现方法。

回到顶部