Flutter全能通讯插件omnitalk_sdk的使用

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

Flutter全能通讯插件omnitalk_sdk的使用

功能概述

功能 实现 iOS Android
音频通话 ✔️ ✔️ ✔️
视频通话 ✔️ ✔️ ✔️
SIP通话 ✔️ ✔️ ✔️
聊天 ✔️ ✔️ ✔️
音频会议 ✔️ ✔️ ✔️
视频会议 ✔️ ✔️ ✔️
静音音频 ✔️ ✔️ ✔️
静音视频 ✔️ ✔️ ✔️
切换视频源 ✔️ ✔️ ✔️

前置条件

  • OmniTalk服务ID与服务密钥

    使用OmniTalk之前,您需要访问OmniTalk网站以获取服务ID和服务密钥。

  • 测试ID和密钥

    您还可以从这里获取一小时免费使用的测试ID和密钥。

  • 最低系统需求

    • Flutter >= 3.1.0
    • Dart >= 2.19
    • Android API >= 21
    • iOS >= 11

开始使用

详细的使用说明请参阅文档

安装

import 'package:omnitalk_sdk/omnitalk_sdk.dart';

创建OmniTalk对象

使用获取的服务ID和服务密钥创建一个OmniTalk对象。

// 初始化OmniTalk SDK
Omnitalk.sdkInit(serviceId: 'Service Id', serviceKey: 'Service Key');

// 获取OmniTalk实例
Omnitalk omnitalk = Omnitalk.getInstance();

创建会话

// 创建会话
await omnitalk.createSession(userId: userId);

创建房间

// 创建房间
await omnitalk.createRoom(roomType: RoomType.videoroom);

加入房间

// 加入房间
await omnitalk.joinRoom(roomId: roomId);

开始广播(视频)

// 开始视频广播
await omnitalk.publish(localRenderer: localVideo);

接收事件消息

// 设置事件监听器
omnitalk.on('event', eventListener);

订阅广播

// 订阅广播
await omnitalk.subscribe(
      publisherSession: publisherSession!, 
      remoteRenderer: remoteVideo);

语音通话(1:1)

// 发起语音通话
await omnitalk.offerCall(
   callType: CallType.audiocall,
   callee: callee);

// 接听语音通话
await omnitalk.answerCall();

视频通话(1:1)

// 发起视频通话
await omnitalk.offerCall(
   callType: CallType.videocall,
   callee: callee!,
   record: false,
   localRenderer: localVideo,
   remoteRenderer: remoteVideo);

// 接听视频通话
await omnitalk.answerCall(
  callType:  CallType.videocall,
  caller: caller,
  localRenderer: localVideo,
  remoteRenderer: remoteVideo);

发送聊天消息

// 发送聊天消息
await omnitalk.sendMessage(action: MessageAction.send, message: message!);

结束广播

// 离开房间
await omnitalk.leave();

文档

完整的易用文档可参阅文档

问题

在使用OmniTalk过程中遇到任何问题或疑问,请访问问题页面

示例项目

展示OmniTalk SDK简单功能实现的示例项目可在demo项目中找到。


示例代码

import 'package:omnitalk_sdk/omnitalk_sdk.dart';

// 初始化OmniTalk SDK
Omnitalk.sdkInit(
        serviceId: 'Service Id', 
        serviceKey: 'Service Key'
);

// 获取OmniTalk实例
Omnitalk omnitalk = Omnitalk.getInstance();

// 请求权限
await omnitalk.getPermission();

// 创建会话
await omnitalk.createSession(userId: userId);

// 创建房间
await omnitalk.createRoom(roomType: RoomType.videoroom);

// 加入房间
await omnitalk.joinRoom(roomId: roomId);

// 开始视频广播
await omnitalk.publish(localRenderer: localVideo);

// 订阅广播
await omnitalk.subscribe(
          publisherSession: publisherSession!, 
          remoteRenderer: remoteVideo
);

// 发起视频通话
await omnitalk.offerCall(
       callType: CallType.videocall,
       callee: callee!,
       record: false,
       localRenderer: localVideo,
       remoteRenderer: remoteVideo
);

// 接听视频通话
await omnitalk.answerCall(
      callType:  CallType.videocall,
      caller: caller,
      localRenderer: localVideo,
      remoteRenderer: remoteVideo
);
   
// 拨打SIP电话
await omnitalk.makeSipNum();

// 发起SIP通话
await omnitalk.offerCall(callType: CallType.sipcall,callee: SipCallee);

// 发送聊天消息
await omnitalk.sendMessage(action: MessageAction.send, message: message!);

// 离开房间
await omnitalk.leave();

// 将指定用户踢出房间
await omnitalk.kickout(target);

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用omnitalk_sdk进行全能通讯的示例代码案例。请注意,由于omnitalk_sdk是一个假定的插件名称,实际的SDK可能会有不同的API和方法。因此,以下代码是一个概念性的示例,你需要根据实际的omnitalk_sdk文档进行调整。

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

dependencies:
  flutter:
    sdk: flutter
  omnitalk_sdk: ^x.y.z  # 替换为实际的版本号

然后,运行flutter pub get来获取依赖。

接下来,在你的Flutter项目中,你可以按照以下方式使用omnitalk_sdk

import 'package:flutter/material.dart';
import 'package:omnitalk_sdk/omnitalk_sdk.dart';  // 导入SDK

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'OmniTalk SDK Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: OmniTalkDemo(),
    );
  }
}

class OmniTalkDemo extends StatefulWidget {
  @override
  _OmniTalkDemoState createState() => _OmniTalkDemoState();
}

class _OmniTalkDemoState extends State<OmniTalkDemo> {
  OmniTalkClient? _omniTalkClient;

  @override
  void initState() {
    super.initState();
    // 初始化OmniTalkClient
    _initOmniTalkClient();
  }

  Future<void> _initOmniTalkClient() async {
    // 替换为你的API密钥和配置
    String apiKey = 'your_api_key_here';
    String userId = 'user_id_here'; // 用户ID,可以是UUID或其他唯一标识符

    _omniTalkClient = OmniTalkClient(
      apiKey: apiKey,
      userId: userId,
    );

    // 连接服务器
    await _omniTalkClient!.connect();

    // 监听连接状态变化
    _omniTalkClient!.connectionStateStream.listen((state) {
      print('Connection State: $state');
      if (state == ConnectionState.connected) {
        // 连接成功后的操作,例如获取用户信息或加入聊天室
        // _omniTalkClient!.getUserInfo();
        // _omniTalkClient!.joinChatRoom('chat_room_id');
      } else if (state == ConnectionState.disconnected) {
        // 连接断开后的操作,例如重连逻辑
        // _reconnect();
      }
    });

    // 监听消息接收事件
    _omniTalkClient!.messageStream.listen((message) {
      print('Received Message: ${message.toJson()}');
      // 更新UI显示新消息
      // setState(() {
      //   // 更新消息列表
      // });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('OmniTalk SDK Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text('Chat Room'),
            // 显示聊天内容(需要维护一个状态列表来存储消息)
            // ListView.builder(
            //   itemCount: messageList.length,
            //   itemBuilder: (context, index) {
            //     return ListTile(
            //       title: Text(messageList[index].content),
            //     );
            //   },
            // ),
            SizedBox(height: 20),
            TextField(
              decoration: InputDecoration(labelText: 'Send a message'),
              onSubmitted: (text) {
                if (_omniTalkClient != null && _omniTalkClient!.isConnected!) {
                  // 发送消息
                  _omniTalkClient!.sendMessage(
                    chatRoomId: 'chat_room_id',  // 替换为实际的聊天室ID
                    content: text,
                  );
                }
              },
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 断开连接并释放资源
    _omniTalkClient?.disconnect();
    _omniTalkClient = null;
    super.dispose();
  }
}

// 假设OmniTalkClient类具有如下API(这需要根据实际的SDK文档进行调整)
class OmniTalkClient {
  final String apiKey;
  final String userId;
  bool? isConnected;

  OmniTalkClient({required this.apiKey, required this.userId});

  Future<void> connect() async {
    // 连接逻辑
    isConnected = true;
  }

  Future<void> disconnect() async {
    // 断开连接逻辑
    isConnected = false;
  }

  Stream<ConnectionState> get connectionStateStream {
    // 返回连接状态流
    return Stream.value(ConnectionState.connected); // 示例代码,实际应根据连接状态更新
  }

  Stream<Message> get messageStream {
    // 返回消息流
    return Stream.periodic(Duration(seconds: 1), (index) {
      // 示例消息
      return Message(content: 'Mock Message $index');
    }).take(10); // 仅发送10条示例消息
  }

  Future<void> sendMessage({required String chatRoomId, required String content}) async {
    // 发送消息逻辑
    print('Sending message to $chatRoomId: $content');
  }
}

enum ConnectionState { connected, connecting, disconnected }

class Message {
  final String content;

  Message({required this.content});

  Map<String, String> toJson() {
    return {'content': content};
  }
}

请注意,上述代码中的OmniTalkClient类及其方法(如connectdisconnectsendMessage等)以及ConnectionStateMessage类都是基于假设的,你需要根据实际的omnitalk_sdk文档进行调整。特别是连接逻辑、消息接收和发送的实现细节将依赖于SDK提供的API。

此外,UI部分(如聊天内容的显示和输入框的处理)也需要根据你的具体需求进行进一步的完善。

回到顶部