ex_im_flutter_call 0.0.4
ex_im_flutter_call: ^0.0.4 copied to clipboard
A Flutter plugin for audio/video calling - provides WebRTC-based 1v1 and group calling functionality for ex_im_flutter_chat.
ex_im_flutter_call #
ExIm Flutter Call SDK - 基于 WebRTC 的音视频通话 Flutter 插件。
功能特性 #
- 1v1 音频/视频通话
- 群组音频/视频通话
- 通话状态管理
- 媒体控制(摄像头切换、静音、扬声器)
- 来电接听/拒绝
- 通话计时
- 屏幕常亮
前置条件 #
本插件依赖 ex_im_flutter_chat 插件。使用前必须先初始化 Chat SDK 并登录。
安装 #
在 pubspec.yaml 中添加依赖:
dependencies:
ex_im_flutter_chat: ^0.0.4
ex_im_flutter_call: ^0.0.1
快速开始 #
1. 初始化 SDK #
import 'package:ex_im_flutter_chat/ex_im_flutter_chat.dart';
import 'package:ex_im_flutter_call/ex_im_flutter_call.dart';
// 先初始化 Chat SDK 并登录
ExImChat.instance.init(tenantId: 'your_tenant_id');
await ExImChat.instance.loginWithEmail(email: '[email protected]', password: 'password');
await ExImChat.instance.connect();
// 然后初始化 Call SDK
ExImCall.instance.init();
2. 发起通话 #
// 发起视频通话
await ExImCall.instance.call(
targetUserId: 'user_id',
callType: CallTypeEnum.video,
targetNickname: '张三',
targetFaceUrl: 'https://example.com/avatar.jpg',
);
// 发起语音通话
await ExImCall.instance.call(
targetUserId: 'user_id',
callType: CallTypeEnum.audio,
targetNickname: '张三',
targetFaceUrl: 'https://example.com/avatar.jpg',
);
3. 监听通话状态 #
// 监听通话状态
ExImCall.instance.callStateStream.listen((state) {
print('通话状态: ${state.mode}');
switch (state.mode) {
case RtcServiceMode.idle:
print('空闲');
break;
case RtcServiceMode.dial:
print('拨号中...');
break;
case RtcServiceMode.invite:
print('来电: ${state.remoteNickname}');
break;
case RtcServiceMode.talking:
print('通话中: ${state.callDuration}秒');
break;
case RtcServiceMode.connecting:
print('连接中...');
break;
default:
break;
}
});
// 监听媒体状态
ExImCall.instance.mediaStateStream.listen((state) {
print('视频: ${state.isVideoEnabled}');
print('音频: ${state.isAudioEnabled}');
print('扬声器: ${state.isSpeakerOn}');
});
4. 接听/拒绝来电 #
// 接听
await ExImCall.instance.accept();
// 拒绝
await ExImCall.instance.reject();
5. 媒体控制 #
// 切换摄像头(前置/后置)
await ExImCall.instance.switchCamera();
// 开关视频
await ExImCall.instance.toggleVideo();
// 开关麦克风
await ExImCall.instance.toggleAudio();
// 开关扬声器
await ExImCall.instance.toggleSpeaker();
6. 挂断通话 #
await ExImCall.instance.hangup();
7. 群组通话 #
// 发起群组通话
await ExImCall.instance.groupCall(
groupId: 'group_id',
userIds: ['user1', 'user2', 'user3'],
callType: CallTypeEnum.video,
memberInfos: [
GroupCallMemberInfo(oderId: 'user1', nickname: '张三', faceUrl: '...'),
GroupCallMemberInfo(oderId: 'user2', nickname: '李四', faceUrl: '...'),
],
);
视频渲染 #
// 获取本地视频渲染器
final localRenderer = ExImCall.instance.rtcEngine.localRenderer;
// 获取远端视频渲染器
final remoteRenderer = ExImCall.instance.rtcEngine.remoteRenderer;
// 在 Widget 中使用
RTCVideoView(localRenderer!)
RTCVideoView(remoteRenderer!)
API 文档 #
ExImCall #
| 方法 | 说明 |
|---|---|
init() |
初始化 SDK |
call(...) |
发起 1v1 通话 |
groupCall(...) |
发起群组通话 |
accept() |
接听来电 |
reject() |
拒绝来电 |
hangup() |
挂断通话 |
switchCamera() |
切换摄像头 |
toggleVideo() |
开关视频 |
toggleAudio() |
开关麦克风 |
toggleSpeaker() |
开关扬声器 |
dispose() |
释放资源 |
CallState #
| 属性 | 说明 |
|---|---|
mode |
通话状态(idle/dial/invite/talking/connecting) |
isGroupCall |
是否群通话 |
roomId |
房间 ID |
callType |
通话类型(audio/video) |
remoteUserId |
对方用户 ID |
remoteNickname |
对方昵称 |
remoteFaceUrl |
对方头像 |
callDuration |
通话时长(秒) |
MediaState #
| 属性 | 说明 |
|---|---|
isVideoEnabled |
视频是否开启 |
isAudioEnabled |
音频是否开启 |
isSpeakerOn |
扬声器是否开启 |
isFrontCamera |
是否前置摄像头 |
hasRemoteStream |
是否有远端流 |
平台支持 #
| 平台 | 支持 |
|---|---|
| Android | ✅ |
| iOS | ✅ |
权限配置 #
Android #
在 AndroidManifest.xml 中添加:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
iOS #
在 Info.plist 中添加:
<key>NSCameraUsageDescription</key>
<string>需要摄像头权限以进行视频通话</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要麦克风权限以进行语音通话</string>
注意事项 #
- 必须先初始化
ex_im_flutter_chat并登录后才能使用本插件 - 通话前请确保已获取摄像头和麦克风权限
- 退出应用前请调用
dispose()释放资源
License #
MIT License