Flutter屏幕录制插件ed_screen_recorder_v3的使用

Flutter屏幕录制插件ed_screen_recorder_v3的使用

ED Flutter Screen Recorder

Screen recorder插件用于Flutter。支持iOS和Android设备。请注意,该插件在iOS模拟器上无法工作。

pubdev

Ekler

android/app/build.gradle
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.github.HBiSoft:HBRecorder:2.0.3'
    implementation 'androidx.appcompat:appcompat:1.4.1'
}
android/app/src/main/AndroidManifest.xml
xmlns:tools="http://schemas.android.com/tools"
package="com.example">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

在Info.plist中添加以下权限信息:

<key>NSPhotoLibraryUsageDescription</key>
<string>保存视频到相册</string>
<key>NSMicrophoneUsageDescription</key>
<string>将音频保存到视频中</string>

Usage/Examples

import 'dart:async';
import 'dart:developer';
import 'dart:io';
import 'package:ed_screen_recorder_v3/ed_screen_recorder.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark(),
      debugShowCheckedModeBanner: false,
      home: const HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  EdScreenRecorder? screenRecorder;
  Map<String, dynamic>? _response;
  bool inProgress = false;

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

  Future<void> startRecord({required String fileName}) async {
    Directory? tempDir = await getApplicationDocumentsDirectory();
    String? tempPath = tempDir.path;
    try {
      var startResponse = await screenRecorder?.startRecordScreen(
        fileName: "Eren",
        // 可选。如果你给定了文件路径,视频将保存在那里。
        // 如果留空,则Android操作系统会将其保存到图库。
        dirPathToSave: tempPath,
        audioEnable: false,
      );
      setState(() {
        _response = startResponse;
      });
      try {
        screenRecorder?.watcher?.events.listen(
          (event) {
            log(event.type.toString(), name: "Event: ");
          },
          onError: (e) => kDebugMode ? debugPrint('ERROR ON STREAM: $e') : null,
          onDone: () => kDebugMode ? debugPrint('Watcher closed!') : null,
        );
      } catch (e) {
        kDebugMode ? debugPrint('ERROR WAITING FOR READY: $e') : null;
      }
    } on PlatformException {
      kDebugMode
          ? debugPrint("Error: An error occurred while starting the recording!")
          : null;
    }
  }

  Future<void> stopRecord() async {
    try {
      var stopResponse = await screenRecorder?.stopRecord();
      setState(() {
        _response = stopResponse;
      });
    } on PlatformException {
      kDebugMode
          ? debugPrint("Error: An error occurred while stopping recording.")
          : null;
    }
  }

  Future<void> pauseRecord() async {
    try {
      await screenRecorder?.pauseRecord();
    } on PlatformException {
      kDebugMode
          ? debugPrint("Error: An error occurred while pause recording.")
          : null;
    }
  }

  Future<void> resumeRecord() async {
    try {
      await screenRecorder?.resumeRecord();
    } on PlatformException {
      kDebugMode
          ? debugPrint("Error: An error occurred while resume recording.")
          : null;
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("屏幕录制调试"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("文件: ${(_response?['file'] as File?)?.path}"),
            Text("状态: ${(_response?['success']).toString()}"),
            Text("事件: ${_response?['eventname']}"),
            Text("进度: ${(_response?['progressing']).toString()}"),
            Text("消息: ${_response?['message']}"),
            Text("视频哈希: ${_response?['videohash']}"),
            Text("开始日期: ${(_response?['startdate']).toString()}"),
            Text("结束日期: ${(_response?['enddate']).toString()}"),
            ElevatedButton(
                onPressed: () => startRecord(fileName: "eren"),
                child: const Text('开始录制')),
            ElevatedButton(
                onPressed: () => resumeRecord(),
                child: const Text('恢复录制')),
            ElevatedButton(
                onPressed: () => pauseRecord(),
                child: const Text('暂停录制')),
            ElevatedButton(
                onPressed: () => stopRecord(),
                child: const Text('停止录制')),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter屏幕录制插件ed_screen_recorder_v3的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter屏幕录制插件ed_screen_recorder_v3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


ed_screen_recorder_v3 是一个 Flutter 插件,用于在 Android 和 iOS 设备上进行屏幕录制。以下是如何使用该插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 ed_screen_recorder_v3 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  ed_screen_recorder_v3: ^0.0.1 # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 初始化插件

在你的 Dart 文件中导入插件并进行初始化:

import 'package:ed_screen_recorder_v3/ed_screen_recorder.dart';

final EdScreenRecorder screenRecorder = EdScreenRecorder();

3. 开始录制

使用 startRecordScreen 方法开始屏幕录制。你需要提供一个文件名(可选)和录制完成后的回调函数。

void startRecording() async {
  try {
    await screenRecorder.startRecordScreen(
      "MyRecording", // 文件名(可选)
      onRecordComplete: (String path) {
        print("Recording completed and saved at: $path");
      },
      onRecordError: (String error) {
        print("Error occurred while recording: $error");
      },
    );
    print("Recording started");
  } catch (e) {
    print("Failed to start recording: $e");
  }
}

4. 停止录制

使用 stopRecordScreen 方法停止录制:

void stopRecording() async {
  try {
    await screenRecorder.stopRecordScreen();
    print("Recording stopped");
  } catch (e) {
    print("Failed to stop recording: $e");
  }
}

5. 处理权限

在 Android 和 iOS 上,屏幕录制需要特定的权限。确保你已在应用中请求了这些权限。

Android

AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />

iOS

Info.plist 中添加以下权限:

<key>NSMicrophoneUsageDescription</key>
<string>We need access to the microphone to record audio.</string>
<key>NSCameraUsageDescription</key>
<string>We need access to the camera to record video.</string>

6. 处理用户界面

你可以使用按钮或其他 UI 元素来触发开始和停止录制的操作:

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Screen Recorder'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: startRecording,
                child: Text('Start Recording'),
              ),
              ElevatedButton(
                onPressed: stopRecording,
                child: Text('Stop Recording'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部