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: 'user@example.com', 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

Libraries

ex_im_flutter_call
ExIm Flutter Call SDK