Flutter实时通信插件livecom_android的使用

Flutter实时通信插件livecom_android的使用

livecom_android

livecom_androidlivecom 的 Android 实现。

Warning!

如果您遇到错误信息“More then one file was found with OS independent path ‘META-INF/xxxxx’”,请查看 /example/android/app/build.gradle 文件。您需要在应用的 build.gradle 文件中添加以下 packagingOptions 块,类似于该文件中的内容。


使用示例

以下是完整的示例代码,展示如何在 Flutter 应用中使用 livecom_android 插件。

示例代码

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:livecom_android/livecom_android.dart';
import 'package:livecom_platform_interface/livecom_delegate.dart';

// 初始化 LiveCom 插件实例
final _liveComPlugin = LiveComAndroid.shared;

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

class MyApp extends StatelessWidget with LiveComDelegate {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 配置 LiveCom 插件
    _liveComPlugin.configure(
        "f400270e-92bf-4df1-966c-9f33301095b3", // 客户端 ID
        "0091FF", // 聊天背景颜色
        "#EF5DA8", // 按钮颜色
        "#0091FF", // 按钮文本颜色
        "#00D1FF", // 聊天框背景颜色
        "https://website.com/{video_id}", // 自定义产品页面 URL
        "https://website.com/{video_id}?p={product_id}" // 自定义结账页面 URL
    );

    // 设置委托对象
    _liveComPlugin.delegate = this;

    log("[LiveCom] configure");

    return MaterialApp(
      title: 'LiveCom Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter screen'),
    );
  }

  // 监听购物车变化事件
  [@override](/user/override)
  void onCartChange(List<String> productSKUs) {
    log("[LiveCom] onCartChange productSKUs: ${productSKUs.join(", ")}");
  }

  // 监听商品添加事件
  [@override](/user/override)
  void onProductAdd(String sku, String streamId) {
    log("[LiveCom] onProductAdd sku: $sku stream_id: $streamId");
  }

  // 监听商品删除事件
  [@override](/user/override)
  void onProductDelete(String productSKU) {
    log("[LiveCom] onProductDelete sku: $productSKU");
  }

  // 监听打开结账屏幕请求
  [@override](/user/override)
  void onRequestOpenCheckoutScreen(List<String> productSKUs) {
    log("[LiveCom] onRequestOpenCheckoutScreen productSKUs: ${productSKUs.join(", ")}");
  }

  // 监听打开产品屏幕请求
  [@override](/user/override)
  void onRequestOpenProductScreen(String sku, String streamId) {
    log("[LiveCom] onRequestOpenProductScreen sku: $sku stream_id: $streamId");
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String streamId = "qQMqXx2wy"; // 当前视频流 ID
  final TextEditingController _textFieldController =
      TextEditingController(text: "qQMqXx2wy"); // 输入流 ID 的控制器

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              // 显示视频列表按钮
              TextButton(
                onPressed: () {
                  _liveComPlugin.presentStreams(); // 打开视频列表
                },
                child: const Text("Show video list"),
              ),
              // 输入流 ID 并显示视频
              TextButton(
                onPressed: () => showDialog(
                  context: context,
                  builder: (BuildContext context) => AlertDialog(
                    title: const Text('Enter stream id'),
                    content: TextField(
                      onChanged: (value) => streamId = value, // 更新流 ID
                      controller: _textFieldController,
                      decoration: const InputDecoration(hintText: "stream id"),
                    ),
                    actions: <Widget>[
                      TextButton(
                        onPressed: () => Navigator.pop(context, 'Cancel'),
                        child: const Text('Cancel'),
                      ),
                      TextButton(
                        onPressed: () {
                          Navigator.pop(context, 'OK');
                          _liveComPlugin.presentStream(streamId); // 打开指定视频
                        },
                        child: const Text('OK'),
                      ),
                    ],
                  ),
                ),
                child: const Text("Show video"),
              ),
              // 同时显示视频列表和视频
              TextButton(
                onPressed: () {
                  _liveComPlugin.presentStreams(); // 打开视频列表
                  _liveComPlugin.presentStream(streamId); // 打开指定视频
                },
                child: const Text("Show list and video"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


livecom_android 是一个用于在 Flutter 应用中实现实时通信的插件。它通常用于 Android 平台,提供实时音视频通话、消息传递等功能。以下是如何在 Flutter 项目中使用 livecom_android 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  livecom_android: ^1.0.0  # 请使用最新版本

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

2. 初始化插件

在你的 Flutter 应用中,首先需要初始化 livecom_android 插件。通常可以在 main.dart 文件中进行初始化。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 livecom_android 插件
  await LivecomAndroid.initialize(
    appId: 'YOUR_APP_ID',  // 替换为你的 App ID
    appKey: 'YOUR_APP_KEY',  // 替换为你的 App Key
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Livecom Demo',
      home: HomeScreen(),
    );
  }
}

3. 实现实时通信功能

接下来,你可以在应用的其他部分使用 livecom_android 插件来实现实时通信功能。例如,发起音视频通话、发送消息等。

发起音视频通话

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

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Livecom Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 发起音视频通话
            await LivecomAndroid.startCall(
              userId: 'TARGET_USER_ID',  // 目标用户 ID
              callType: CallType.video,  // 通话类型:视频或音频
            );
          },
          child: Text('Start Call'),
        ),
      ),
    );
  }
}

发送消息

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

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Livecom Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 发送消息
            await LivecomAndroid.sendMessage(
              userId: 'TARGET_USER_ID',  // 目标用户 ID
              message: 'Hello, World!',  // 消息内容
            );
          },
          child: Text('Send Message'),
        ),
      ),
    );
  }
}

4. 处理回调

livecom_android 插件通常会提供一些回调来处理通话状态、消息接收等事件。你可以在初始化时设置这些回调。

await LivecomAndroid.initialize(
  appId: 'YOUR_APP_ID',
  appKey: 'YOUR_APP_KEY',
  onCallReceived: (callerId) {
    // 处理来电
    print('Received call from $callerId');
  },
  onMessageReceived: (message) {
    // 处理接收到的消息
    print('Received message: $message');
  },
);

5. 处理权限

在 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" />

并在运行时请求这些权限。

import 'package:permission_handler/permission_handler.dart';

void requestPermissions() async {
  await Permission.camera.request();
  await Permission.microphone.request();
}

6. 处理生命周期

在 Flutter 中,你可能需要处理应用的生命周期事件,以确保在应用进入后台或恢复时正确处理实时通信。

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

class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  [@override](/user/override)
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  [@override](/user/override)
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.paused) {
      // 应用进入后台
      LivecomAndroid.pause();
    } else if (state == AppLifecycleState.resumed) {
      // 应用恢复
      LivecomAndroid.resume();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Livecom Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            await LivecomAndroid.startCall(
              userId: 'TARGET_USER_ID',
              callType: CallType.video,
            );
          },
          child: Text('Start Call'),
        ),
      ),
    );
  }
}
回到顶部