Flutter屏幕捕获插件screen_capture的使用

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

Flutter屏幕捕获插件screen_capture的使用

描述

screen_capture 是一个Flutter插件,专为macOS和iOS设计,用于录制屏幕并捕获系统音频(非麦克风)。该插件旨在与Flutter应用程序无缝集成,目前仅支持macOS和iOS平台的屏幕录制功能。

功能特性

  • 屏幕录制功能:支持macOS和iOS平台的屏幕录制。
  • 系统音频录制:仅捕获系统音频,不包括麦克风输入。
  • 可自定义的录制设置:可以根据需求调整录制参数。
  • 简单的API:提供简单易用的API来启动和停止录制。

安装

pubspec.yaml 文件中添加 screen_capture 作为依赖项:

dependencies:
  screen_capture:
    git:
      url: https://github.com/TheBilalJaved/screen_capture.git

然后运行以下命令以安装插件:

flutter pub get

使用方法

  1. 导入插件 在Dart代码中导入 screen_capture 包:

    import 'package:screen_capture/screen_capture.dart';
    
  2. 启动和停止录制 使用 startRecordingstopRecording 方法来管理录制会话:

    // 启动录制
    await FlutterScreenCapture.startRecording();
    
    // 停止录制
    await FlutterScreenCapture.stopRecording();
    
  3. 保存和播放录制文件 录制完成后,可以将录制文件保存到本地,并使用媒体播放器进行回放。

权限设置

确保您的macOS应用程序具有必要的权限:

  1. 打开 macos/Runner/Info.plist 文件。

  2. 添加以下键以请求屏幕录制权限:

    <key>NSCameraUsageDescription</key>
    <string>我们需要访问以录制屏幕。</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>我们需要访问以在屏幕录制期间捕获系统音频。</string>
    

注意事项

  • 该插件目前仅支持macOS和iOS平台。
  • 插件仅捕获系统音频,不包括麦克风输入。
  • 音频通过 AVAudioEngine 捕获,如有需要可以进一步自定义。

许可证

MIT License。详情请参阅LICENSE文件。

示例代码

以下是一个完整的示例demo,展示了如何使用 screen_capture 插件进行屏幕录制:

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Screen Recorder Example',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Screen Recorder Example'),
        ),
        body: const ScreenRecorderWidget(),
      ),
    );
  }
}

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

  [@override](/user/override)
  State<ScreenRecorderWidget> createState() => _ScreenRecorderWidgetState();
}

class _ScreenRecorderWidgetState extends State<ScreenRecorderWidget> {
  String _status = "Ready to Record";

  void _startRecording() async {
    try {
      final result = await FlutterScreenCapture.startRecording();
      setState(() {
        _status = result; // 更新状态为录制开始后的返回结果
      });
    } catch (e) {
      setState(() {
        _status = "Error starting recording: $e"; // 捕获并显示错误信息
      });
    }
  }

  void _stopRecording() async {
    try {
      final result = await FlutterScreenCapture.stopRecording();
      setState(() {
        _status = result; // 更新状态为录制停止后的返回结果
      });
    } catch (e) {
      setState(() {
        _status = "Error stopping recording: $e"; // 捕获并显示错误信息
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text(_status), // 显示当前状态
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: _startRecording, // 点击按钮启动录制
                child: const Text("Start Recording"),
              ),
              const SizedBox(width: 20), // 添加间距
              ElevatedButton(
                onPressed: _stopRecording, // 点击按钮停止录制
                child: const Text("Stop Recording"),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用screen_capture插件进行屏幕捕获的示例代码。这个示例将展示如何安装插件、配置权限、以及实现基本的屏幕捕获功能。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  screen_capture: ^x.y.z  # 请替换为最新版本号

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

2. 配置权限

由于屏幕捕获可能涉及到敏感操作,你需要在AndroidManifest.xmlInfo.plist中配置相应的权限。

Android

android/app/src/main/AndroidManifest.xml中添加以下权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

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

    <!-- 其他配置 -->

</manifest>

iOS

ios/Runner/Info.plist中,你可能需要添加屏幕录制权限的说明(虽然screen_capture插件本身可能不需要显式iOS权限,但如果你处理录制的视频,可能需要)。

3. 实现屏幕捕获

接下来,在你的Flutter代码中实现屏幕捕获功能。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:screen_capture/screen_capture.dart';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:path_provider/path_provider.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Screen Capture Example'),
        ),
        body: Center(
          child: CaptureButton(),
        ),
      ),
    );
  }
}

class CaptureButton extends StatefulWidget {
  @override
  _CaptureButtonState createState() => _CaptureButtonState();
}

class _CaptureButtonState extends State<CaptureButton> {
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () async {
        try {
          // 请求屏幕截图
          RenderRepaintBoundary boundary =
              globalKey.currentContext!.findRenderObject()! as RenderRepaintBoundary;
          ui.Image image = await boundary.toImage();
          ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.png);
          Uint8List pngBytes = byteData!.buffer.asUint8List();

          // 获取存储路径
          Directory appDocDir = await getApplicationDocumentsDirectory();
          String appDocPath = appDocDir.path;
          String imgPath = '$appDocPath/screenshot.png';

          // 保存截图到文件
          File file = File(imgPath);
          await file.writeAsBytes(pngBytes);

          print('Screenshot saved to $imgPath');
        } catch (e) {
          print('Error capturing screenshot: $e');
        }
      },
      child: Text('Capture Screen'),
    );
  }

  final GlobalKey globalKey = GlobalKey();
}

class ScreenshotWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RepaintBoundary(
      key: UniqueKey(), // 使用UniqueKey来确保每次构建时都能捕获新的屏幕内容
      child: Container(
        color: Colors.amber,
        child: Center(
          child: Text(
            'Hello, Flutter!',
            style: TextStyle(fontSize: 24),
          ),
        ),
      ),
    );
  }
}

注意:上面的代码示例中,ScreenshotWidget并没有直接使用,但为了完整性,展示了如何使用RepaintBoundaryGlobalKey来捕获特定部分的屏幕。在实际使用中,你可能需要将RepaintBoundary包裹在你想要捕获的屏幕内容外部,并确保GlobalKey是唯一的。

在实际应用中,你可能需要将捕获的屏幕内容显示给用户、上传到服务器或者进行其他处理。上述代码仅展示了如何捕获屏幕并保存到本地存储。

回到顶部