Flutter屏幕录制插件screen_record_flutter的使用

Flutter屏幕录制插件screen_record_flutter的使用

screen_record_flutter

Flutter 插件,用于记录用户操作以进行分析。

目录


获取开始

在您的 Flutter 项目中引入 screen_record_flutter 插件后,您可以轻松地开始录制屏幕。


安装

pubspec.yaml 文件中添加以下依赖:

dependencies:
  screen_record_flutter: ^0.0.1+3

然后运行 flutter pub get 更新依赖。


需求

在 Android 的 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

使用

导入包

首先,在 Dart 文件中导入 screen_record_flutter 包:

import 'package:screen_record_flutter/screen_record_flutter.dart';

开始录制

使用以下方法开始录制屏幕:

void startRecording() async {
  // 获取保存目录
  final dir = '${(await _getSavedDir())}';
  await Directory(dir).create(recursive: true);

  // 构造文件名
  final stem = '$dir/${DateTime.now().toIso8601String().replaceAll(".", "").replaceAll(":", "")}';
  pathData = '$stem.mp4';
  meta = '$stem.meta';

  log('RECORDED VIDEO PATH = $pathData');

  // 启动录制
  await _recorder
      .start(
    pathVideo: pathData,
    pathMetadata: meta,
  )
      .then((value) {
    log("RECORDING STARTED");
  });
}

停止录制

调用以下方法停止录制,视频将自动保存:

void stopRecording() {
  _recorder.stop().then((value) {
    log("RECORDING STOPPED");
  });
}

录制特定小部件

要录制某个特定的小部件,可以将其包裹在 ScreenRecordWidget 中,然后使用上述方法进行录制。

ScreenRecordWidget(
  child: YourWidget(),
)

在应用内播放录制的视频

可以使用 ScreenRecordPlayerWidget 播放录制的视频:

ScreenRecordPlayerWidget(filePath: pathData)

注意事项

  • 如果应用程序进入后台而未调用 stop 方法,则录制的视频将不会被保存。
  • 为了解决这个问题,可以使用 flutter_fgbg 插件来监听应用的状态。有关更多信息,请参阅示例标签。

完整示例代码

以下是完整的示例代码,展示了如何使用 screen_record_flutter 插件:

import 'dart:async';
import 'dart:log';
import 'dart:io';

import 'package:screen_record_flutter/screen_record_flutter.dart';
import 'package:flutter/material.dart';
import 'package:flutter_fgbg/flutter_fgbg.dart';
import 'package:path_provider/path_provider.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

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

class _MyAppState extends State<MyApp> {
  late StreamSubscription<FGBGType> subscription;
  final _recorder = ScreenRecord.instance;
  String pathData = "";
  String meta = "";

  [@override](/user/override)
  void initState() {
    startRecording();
    subscription = FGBGEvents.stream.listen((event) {
      if (event == FGBGType.background) {
        stopRecording();
      } else if (event == FGBGType.foreground) {
        startRecording();
      }

      log(event.toString());
    });
    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    subscription.cancel();
    super.dispose();
  }

  void startRecording() async {
    final dir = '${(await _getSavedDir())}';
    await Directory(dir).create(recursive: true);
    final stem = '$dir/${DateTime.now().toIso8601String().replaceAll(".", "").replaceAll(":", "")}';
    pathData = '$stem.mp4';
    meta = '$stem.meta';

    log('RECORDED VIDEO PATH = $pathData');

    await _recorder
        .start(
      pathVideo: pathData,
      pathMetadata: meta,
    )
        .then((value) {
      log("RECORDING STARTED");
    });
  }

  void stopRecording() {
    _recorder.stop().then((value) {
      log("RECORDING STOPPED");
    });
  }

  static Future<String?> _getSavedDir() async {
    String? externalStorageDirPath;

    if (Platform.isAndroid) {
      try {
        externalStorageDirPath = '/storage/emulated/0/Download';
      } catch (e) {
        final directory = await getExternalStorageDirectory();
        externalStorageDirPath = directory?.path;
      }
    } else if (Platform.isIOS) {
      externalStorageDirPath = (await getApplicationDocumentsDirectory()).absolute.path;
    }
    log('PATH FOR DOWNLOAD ::: $externalStorageDirPath');
    return externalStorageDirPath;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: ListView.builder(
          itemBuilder: (context, index) => ListTile(
            onTap: () {
              Navigator.of(context)
                  .push(MaterialPageRoute(builder: (_) => const SecondPage()));
            },
            title: Text('Item $index'),
            subtitle: Text('Random text $index'),
          ),
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  const SecondPage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const Scaffold(
      body: SafeArea(
        child: Column(
          children: [Text("data")],
        ),
      ),
    );
  }
}

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

1 回复

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


screen_record_flutter 是一个用于在 Flutter 应用中实现屏幕录制的插件。它允许你捕获设备屏幕并将其保存为视频文件。以下是如何使用 screen_record_flutter 插件的基本步骤:

1. 添加依赖

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

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

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

2. 导入插件

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

import 'package:screen_record_flutter/screen_record_flutter.dart';

3. 初始化插件

创建一个 ScreenRecord 实例:

final screenRecord = ScreenRecord();

4. 开始屏幕录制

使用 startRecordScreen 方法开始屏幕录制:

void startRecording() async {
  try {
    await screenRecord.startRecordScreen(
      fileName: 'my_recording.mp4',  // 设置文件名
      videoQuality: VideoQuality.High,  // 设置视频质量
    );
    print('Screen recording started');
  } catch (e) {
    print('Failed to start recording: $e');
  }
}

5. 停止屏幕录制

使用 stopRecordScreen 方法停止屏幕录制:

void stopRecording() async {
  try {
    String? filePath = await screenRecord.stopRecordScreen();
    if (filePath != null) {
      print('Screen recording saved to: $filePath');
    } else {
      print('Screen recording not saved');
    }
  } catch (e) {
    print('Failed to stop recording: $e');
  }
}

6. 检查录制状态

你可以使用 isRecording 方法来检查当前是否正在录制:

void checkRecordingStatus() async {
  bool isRecording = await screenRecord.isRecording();
  if (isRecording) {
    print('Screen is currently recording');
  } else {
    print('Screen is not recording');
  }
}

7. 处理权限

在 Android 上,屏幕录制需要 RECORD_AUDIOWRITE_EXTERNAL_STORAGE 权限。你需要在 AndroidManifest.xml 中添加以下权限:

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

在 iOS 上,屏幕录制需要用户授权。你可以使用 permission_handler 插件来请求权限。

8. 示例代码

以下是一个完整的示例代码,展示了如何开始和停止屏幕录制:

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

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

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

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

class _ScreenRecordingPageState extends State<ScreenRecordingPage> {
  final screenRecord = ScreenRecord();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen Recording Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: startRecording,
              child: Text('Start Recording'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: stopRecording,
              child: Text('Stop Recording'),
            ),
          ],
        ),
      ),
    );
  }

  void startRecording() async {
    try {
      await screenRecord.startRecordScreen(
        fileName: 'my_recording.mp4',
        videoQuality: VideoQuality.High,
      );
      print('Screen recording started');
    } catch (e) {
      print('Failed to start recording: $e');
    }
  }

  void stopRecording() async {
    try {
      String? filePath = await screenRecord.stopRecordScreen();
      if (filePath != null) {
        print('Screen recording saved to: $filePath');
      } else {
        print('Screen recording not saved');
      }
    } catch (e) {
      print('Failed to stop recording: $e');
    }
  }
}
回到顶部