Flutter功能未知插件enx_flutter_plugin的介绍与使用

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

Flutter功能未知插件enx_flutter_plugin的介绍与使用

enx_flutter_plugin 是一个用于集成EnableX Video SDK的Flutter插件,它允许开发者在其应用程序中实现实时通信(RTC)通道,如音频、视频和文本聊天服务。该插件提供了一组简单的API,可以在用户的应用程序中调用以集成RTC服务。

使用方法

要使用此插件,请在 pubspec.yaml 文件中添加 enx_flutter_plugin 作为依赖项:

dependencies:
  enx_flutter_plugin: ^latest_version

然后运行 flutter pub get 来安装插件。

入门指南

参考 EnableX GitHub Repository 中的一个一对一视频通话示例应用,了解更多关于如何使用 enx_flutter_plugin 的信息。

设备权限

Android

打开 AndroidManifest.xml 文件并添加所需的设备权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<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" />

iOS

打开 info.plist 文件并添加以下内容:

  • Privacy - Microphone Usage Description 并在值列中添加注释。
  • Privacy - Camera Usage Description 并在值列中添加注释。

确保您的应用程序可以在后台运行语音通话,如果启用了后台模式,则选择Xcode中的应用程序目标,点击Capabilities选项卡,启用Background Modes,并检查Audio, AirPlay, and Picture in Picture。

为了避免iOS上的黑屏问题,请将 io.flutter.embedded_views_preview 设置为 YESinfo.plist 中。

示例代码

以下是使用 enx_flutter_plugin 实现简单视频通话界面的示例代码:

import 'dart:convert';
import 'package:enx_flutter_plugin/base.dart';
import 'package:enx_flutter_plugin/enx_player_widget.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:enx_flutter_plugin/enx_flutter_plugin.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
import 'call_ui.dart';

void main() {
  runApp(MaterialApp(
    title: "Sample App",
    debugShowCheckedModeBanner: false,
    theme: ThemeData(brightness: Brightness.light, primaryColor: Colors.deepPurple),
    home: MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _State createState() => _State();
}

class _State extends State<MyApp> {
  static const String kBaseURL = "https://meeting-demo-qa.enablex.io/";
  static bool kTry = false;
  static const String kAppId = "app-key";
  static const String kAppkey = "app key";
  bool isPreview = false;

  TextEditingController nameController = TextEditingController();
  TextEditingController roomIdController = TextEditingController();
  static String token = "";

  // 省略部分代码...

  [@override](/user/override)
  Widget build(BuildContext context) {
    final usernameField = TextField(
      obscureText: false,
      style: style,
      controller: nameController,
      decoration: InputDecoration(
        contentPadding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
        hintText: "Username",
        border: OutlineInputBorder(borderRadius: BorderRadius.circular(32.0)),
      ),
    );

    final roomIdField = TextField(
      obscureText: false,
      controller: roomIdController,
      style: style,
      decoration: InputDecoration(
        contentPadding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
        hintText: "Enter pin",
        border: OutlineInputBorder(borderRadius: BorderRadius.circular(32.0)),
      ),
    );

    final joinButon = Material(
      elevation: 5.0,
      borderRadius: BorderRadius.circular(30.0),
      color: Colors.deepPurple,
      child: MaterialButton(
        minWidth: 100,
        padding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
        onPressed: () {
          joinRoomValidations();
          if (isValidated) {
            getPin();
          }
        },
        child: Text("Join", style: style.copyWith(color: Colors.white, fontWeight: FontWeight.normal)),
      ),
    );

    final precallTestButon = Material(
      elevation: 5.0,
      borderRadius: BorderRadius.circular(30.0),
      color: Colors.deepPurple,
      child: MaterialButton(
        minWidth: 100,
        padding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
        onPressed: () {
          Map<String, dynamic> map = {
            'testDurationDataThroughput': 2,
            'testDurationVideoBandwidth': 30,
            'testDurationAudioBandwidth': 30,
            'stop': isPrecallTest,
            'regionId': ['IN'],
            'testNames': ['microphone'],
          };
          EnxRtc.getPreview();

          setState(() {
            isPreview = true;
          });
        },
        child: Text("Precall Test", style: style.copyWith(color: Colors.white, fontWeight: FontWeight.normal)),
      ),
    );

    return Scaffold(
      appBar: AppBar(title: Text('Sample App')),
      body: Padding(
        padding: EdgeInsets.all(10),
        child: ListView(
          children: <Widget>[
            Container(
              alignment: Alignment.center,
              padding: EdgeInsets.all(10),
              child: Text('Enablex', style: TextStyle(color: Colors.redAccent, fontWeight: FontWeight.w500, fontSize: 30)),
            ),
            Container(
              alignment: Alignment.center,
              padding: EdgeInsets.all(10),
              child: Text('Welcome !', style: TextStyle(fontSize: 20)),
            ),
            Container(padding: EdgeInsets.all(10), child: usernameField),
            Container(padding: EdgeInsets.fromLTRB(10, 10, 10, 0), child: roomIdField),
            Container(
              alignment: Alignment.center,
              height: 100,
              width: 100,
              child: Row(
                children: <Widget>[
                  Expanded(flex: 1, child: Padding(padding: EdgeInsets.all(10), child: joinButon)),
                  Expanded(flex: 1, child: Padding(padding: EdgeInsets.all(10), child: precallTestButon)),
                ],
              ),
            ),
            isPreview ? Container(
              height: 120,
              width: 500,
              child: EnxPlayerWidget(0, local: true, width: 500, height: 100, mScalingType: ScalingType.SCALE_ASPECT_FILL),
            ) : Container(height: 120, width: 120, color: Colors.red),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter功能未知插件enx_flutter_plugin的介绍与使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能未知插件enx_flutter_plugin的介绍与使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Flutter功能未知插件 enx_flutter_plugin 的介绍与使用

介绍

enx_flutter_plugin 是一个用于 Flutter 的插件,尽管其具体功能和用途可能并不广为人知,但我们可以根据插件的一般使用方法和 Flutter 的标准插件结构来介绍其使用方式。请注意,由于此插件的具体功能和API可能随着版本更新而变化,以下代码案例基于假设的插件结构和功能。

使用步骤

  1. 添加依赖

    首先,你需要在 Flutter 项目的 pubspec.yaml 文件中添加该插件的依赖。假设插件已经在 Pub 上发布,你可以这样添加:

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

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

  2. 导入插件

    在你的 Dart 文件中导入插件:

    import 'package:enx_flutter_plugin/enx_flutter_plugin.dart';
    
  3. 初始化插件

    通常,插件需要在应用启动时进行初始化。你可以在 main.dart 中的 MyApp 类中完成这一操作:

    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // 初始化插件(假设插件有一个名为 initialize 的方法)
        EnxFlutterPlugin.initialize();
    
        return MaterialApp(
          // ... 其他配置
        );
      }
    }
    
  4. 使用插件功能

    假设 enx_flutter_plugin 提供了一个名为 performAction 的方法,你可以这样调用它:

    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Plugin Demo'),
          ),
          body: Center(
            child: ElevatedButton(
              onPressed: () async {
                try {
                  // 调用插件功能
                  var result = await EnxFlutterPlugin.performAction();
                  print('Action result: $result');
                } catch (e) {
                  print('Error: $e');
                }
              },
              child: Text('Perform Action'),
            ),
          ),
        );
      }
    }
    
  5. 处理回调和事件

    如果插件支持事件监听,你可以使用事件流来处理回调。例如,假设插件有一个 onEvent 的流:

    class _MyHomePageState extends State<MyHomePage> {
      EnxFlutterPluginEventSubscription? _subscription;
    
      @override
      void initState() {
        super.initState();
    
        // 订阅插件事件
        _subscription = EnxFlutterPlugin.onEvent.listen((event) {
          print('Received event: $event');
        });
      }
    
      @override
      void dispose() {
        // 取消订阅
        _subscription?.cancel();
        _subscription = null;
        super.dispose();
      }
    
      // ... 其他代码
    }
    

注意事项

  • 由于 enx_flutter_plugin 的具体API和功能未知,上述代码案例是基于假设的插件结构和一般Flutter插件的使用方法。
  • 在实际使用中,请查阅插件的官方文档和示例代码以获取准确的使用方法和API。
  • 如果插件尚未在 Pub 上发布,你可能需要从源代码手动集成该插件。

希望这些信息能帮助你开始使用 enx_flutter_plugin。如果你有更具体的问题或需要关于特定功能的帮助,请查阅插件的官方文档或联系插件的维护者。

回到顶部