Flutter视频通话插件call_video的使用
Flutter视频通话插件call_video的使用
开始使用
可以从以下示例文件夹获取一些基本和高级示例:
隐私权限
Call Video SDK 需要 Camera
和 Microphone
权限才能开始视频通话。
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
更多关于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();
}
}
注意事项
- Agora App ID和Token:确保你已经从Agora官网获取了App ID,并正确生成了Token(如果需要)。
- 权限请求:在Android和iOS上,你需要在运行时请求相机和麦克风权限。
- UI渲染:上述代码仅展示了如何加入和离开频道,没有包含视频渲染的部分。你可以使用Agora提供的视频渲染组件来显示本地和远程视频流。
希望这个示例能帮助你开始在Flutter项目中实现视频通话功能。如果你使用的是其他视频通话插件,请查阅该插件的官方文档以获取具体的实现方法。