Flutter VoIP通信插件flutter_pitel_voip的使用

Flutter VoIP通信插件flutter_pitel_voip的使用

插件简介

flutter_pitel_voip 是一个支持 VoIP 通话的插件。要使用该服务,请联系 Pitel


示例展示

注册扩展

注册扩展

呼叫界面

呼叫界面


Pitel Connect 流程

当用户从 Pitel Connect 应用发起呼叫时,Pitel 服务器会向所有登录用户(接收到呼叫的用户)推送通知。当用户接受呼叫时,扩展将重新注册以接收呼叫。

Pitel Connect 流程


功能特性

  • 注册扩展
  • 呼叫功能
  • 挂断功能
  • 开启/关闭麦克风
  • 开启/关闭扬声器

安装步骤

1. 添加依赖包

使用命令行安装:

flutter pub add flutter_pitel_voip

或者手动添加到 pubspec.yaml 文件中:

flutter_pitel_voip: any

2. 获取依赖包

运行以下命令以获取依赖:

flutter pub get

3. 导入插件

在 Dart 文件中导入:

import 'package:flutter_pitel_voip/flutter_pitel_voip.dart';

4. 配置项目

app.dart 中配置 easyloading

import 'package:flutter_easyloading/flutter_easyloading.dart';

return MaterialApp.router(
  builder: EasyLoading.init(),
);

Android 配置

android/app/src/main/AndroidManifest.xml 文件中添加权限:

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

iOS 配置

Info.plist 文件中请求权限:

<key>NSMicrophoneUsageDescription</key>
<string>Use microphone</string>
<key>UIBackgroundModes</key>
<array>
	<string>fetch</string>
	<string>processing</string>
	<string>remote-notification</string>
	<string>voip</string>
</array>

确保 Podfile 的平台版本为 13.0

platform :ios, '13.0'

推送通知配置

请参考 PUSH_NOTIF.md 文件进行 Pushkit(iOS)和推送通知(Android)的设置。


故障排查

[仅限 Android] 如果在运行应用时出现 flutter_webrtc 错误,请更新以下文件中的代码:

$HOME/.pub-cache/hosted/pub.dartlang.org/flutter_webrtc-{version}/android/build.gradle

修改内容如下:

dependencies {
  // 移除旧版本
  // implementation 'com.github.webrtc-sdk:android:104.5112.03'

  // 替换为新版本
  implementation 'io.github.webrtc-sdk:android:104.5112.09'
}

示例代码

以下是完整的示例代码,展示如何使用 flutter_pitel_voip 插件。

1. 主应用配置 (app.dart)

在主应用中包裹 MaterialAppPitelVoip

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

Widget build(BuildContext context) {
  return PitelVoip(
    handleRegister: handleRegister, // 处理注册
    handleRegisterCall: handleRegisterCall, // 处理呼叫注册
    child: MaterialApp.router(
      // 其他路由配置...
    ),
  );
}

2. 主页面配置 (home_screen.dart)

在主页面中包裹 PitelVoipCall

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

class HomeScreen extends StatelessWidget {
  final String bundleId = 'your_bundle_id'; // 替换为实际值
  final String appleTeamId = 'your_apple_team_id'; // 替换为实际值
  final String domain = 'your_domain'; // 替换为实际值
  final String outboundProxy = 'your_outbound_proxy'; // 替换为实际值
  final int port = 5060; // 替换为实际值
  final String uUser = '101'; // 替换为实际值
  final String displayName = 'John Doe'; // 替换为实际值
  final String urlWss = 'wss://your_wss_url'; // 替换为实际值
  final String apiDomain = 'https://your_api_domain'; // 替换为实际值

  [@override](/user/override)
  Widget build(BuildContext context) {
    return PitelVoipCall(
      bundleId: bundleId,
      appMode: 'dev', // 替换为实际模式(dev 或 production)
      sipInfoData: SipInfoData.fromJson({
        "authPass": "your_password",
        "registerServer": domain,
        "outboundServer": outboundProxy,
        "port": port,
        "accountName": uUser,
        "displayName": displayName,
        "wssUrl": urlWss,
        "apiDomain": apiDomain,
      }),
      goBack: () {
        Navigator.pop(context); // 返回上一页
      },
      goToCall: () {
        Navigator.pushNamed(context, '/call'); // 跳转到呼叫页面
      },
      onCallState: (callState) {
        // 设置呼叫状态到全局状态管理(如 Riverpod、GetX 等)
        print('当前呼叫状态: $callState');
      },
      onRegisterState: (String registerState) {
        print('注册状态: $registerState');
      },
      child: Center(child: Text('Home Page')),
    );
  }
}

3. 呼叫页面配置 (call_screen.dart)

在呼叫页面中实现呼叫逻辑:

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

class CallPage extends StatelessWidget {
  final CallState callState; // 从全局状态管理中获取呼叫状态

  const CallPage({Key? key, required this.callState}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return CallScreen(
      callState: callState,
      goBack: () {
        Navigator.pop(context); // 返回上一页
      },
      bgColor: Colors.cyan,
      txtMute: '静音',
      txtUnMute: '取消静音',
      txtSpeaker: '扬声器',
      textStyle: TextStyle(fontSize: 18),
      titleTextStyle: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
      showHoldCall: true, // 显示挂起按钮
    );
  }
}

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

1 回复

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


flutter_pitel_voip 是一个用于在 Flutter 应用中实现 VoIP(Voice over IP)通信的插件。它允许你在应用中实现语音通话功能。以下是使用 flutter_pitel_voip 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_pitel_voip 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_pitel_voip: ^latest_version

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

2. 初始化插件

在你的 Dart 代码中,首先需要初始化 flutter_pitel_voip 插件。通常在 main.dart 或某个初始化函数中进行:

import 'package:flutter_pitel_voip/flutter_pitel_voip.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await FlutterPitelVoip.initialize();
  runApp(MyApp());
}

3. 配置 VoIP 服务

根据你的 VoIP 服务提供商的要求,配置 flutter_pitel_voip 插件。这可能包括设置服务器地址、端口、认证信息等。

await FlutterPitelVoip.configure(
  server: 'your.voip.server.com',
  port: 5060,
  username: 'your_username',
  password: 'your_password',
);

4. 注册 SIP 账户

在使用 VoIP 功能之前,通常需要注册一个 SIP 账户:

await FlutterPitelVoip.registerSipAccount(
  username: 'your_sip_username',
  password: 'your_sip_password',
);

5. 拨打电话

要拨打电话,可以使用 makeCall 方法:

await FlutterPitelVoip.makeCall('recipient_sip_address');

6. 接听电话

要接听来电,可以使用 answerCall 方法:

await FlutterPitelVoip.answerCall();

7. 挂断电话

要挂断电话,可以使用 endCall 方法:

await FlutterPitelVoip.endCall();

8. 处理来电通知

你可以在应用中监听来电通知,以便在用户收到来电时执行某些操作。通常,你可以使用 flutter_local_notifications 插件来处理通知。

FlutterPitelVoip.onCallReceived.listen((call) {
  // 处理来电通知
  showIncomingCallNotification(call);
});

9. 处理通话状态

你可以监听通话状态的变化,以便在通话状态改变时执行某些操作:

FlutterPitelVoip.onCallStateChanged.listen((state) {
  // 处理通话状态变化
  print('Call state changed: $state');
});

10. 清理资源

在应用退出时,确保清理 VoIP 资源:

@override
void dispose() {
  FlutterPitelVoip.dispose();
  super.dispose();
}

11. 处理权限

在 Android 和 iOS 上,使用 VoIP 功能通常需要特定的权限。确保在应用中请求并处理这些权限。

import 'package:permission_handler/permission_handler.dart';

void requestPermissions() async {
  await Permission.microphone.request();
  await Permission.phone.request();
  // 其他需要的权限
}

12. 处理后台运行(仅适用于 iOS)

在 iOS 上,VoIP 应用通常需要在后台运行以接收来电。你需要在 Info.plist 文件中添加 UIBackgroundModes 键:

<key>UIBackgroundModes</key>
<array>
  <string>voip</string>
</array>
回到顶部