Flutter屏幕录制插件screen_recoder_7的使用

Flutter屏幕录制插件screen_recoder_7的使用

依赖项

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文件中添加以下权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    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" />
</manifest>

Info.plist文件中添加以下键值对:

<key>NSPhotoLibraryUsageDescription</key>
<string>保存视频到图库</string>
<key>NSMicrophoneUsageDescription</key>
<string>保存音频到视频</string>

使用示例

以下是使用screen_recoder_7插件进行屏幕录制的完整示例代码。

主要代码文件:example/lib/main.dart

import 'dart:async';
import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:screen_recoder_7/screen_recoder_7.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> {
  Screenrecoder7? screenRecorder;
  Map<String, dynamic>? _response;
  bool inProgress = false;

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

  Future<void> startRecord({required String fileName}) async {
    try {
      var startResponse = await screenRecorder?.startRecordScreen(
          directory: "screen_recorder_7",
          fileName: fileName,
          audioEnable: true,
          wasHDSelected: true);
      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("File: ${(_response?['file'] as File?)}"),
            Text("filedirectory: ${(_response?['filedirectory'] as File?)}"),
            Text("fileName: ${_response?['fileName']}"),
            Text("Filesize: ${(_response?['filesize'].toString())}"),
            Text("addfilesize: ${(_response?['addfilesize'].toString())}"),
            Text("Status: ${(_response?['success']).toString()}"),
            Text("cloudStorage: ${(_response?['cloudStorage']).toString()}"),
            Text("Event: ${_response?['eventname']}"),
            Text("Progress: ${(_response?['progressing']).toString()}"),
            Text("Message: ${_response?['message']}"),
            Text("Video Hash: ${_response?['videohash']}"),
            Text("Start Date: ${(_response?['startdate']).toString()}"),
            Text("End Date: ${(_response?['enddate']).toString()}"),
            ElevatedButton(
              onPressed: () => startRecord(fileName: "testrecording"),
              child: const Text('开始录制'),
            ),
            ElevatedButton(
              onPressed: () => resumeRecord(),
              child: const Text('恢复录制'),
            ),
            ElevatedButton(
              onPressed: () => pauseRecord(),
              child: const Text('暂停录制'),
            ),
            ElevatedButton(
              onPressed: () => stopRecord(),
              child: const Text('停止录制'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


screen_recorder_7 是一个用于在 Flutter 应用中实现屏幕录制的插件。以下是如何使用 screen_recorder_7 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  screen_recorder_7: ^latest_version

请将 latest_version 替换为最新版本的 screen_recorder_7 插件。

2. 获取权限

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

在 iOS 上,你需要确保在 Info.plist 文件中添加相应的权限描述。

3. 初始化插件

在你的 Dart 代码中,导入 screen_recorder_7 插件并初始化它:

import 'package:screen_recorder_7/screen_recorder_7.dart';

final screenRecorder = ScreenRecorder();

4. 开始录制

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

await screenRecorder.startRecording();

5. 停止录制

使用 stopRecording 方法停止屏幕录制,并获取录制的视频文件路径:

String? videoPath = await screenRecorder.stopRecording();
if (videoPath != null) {
  print("Video saved at: $videoPath");
} else {
  print("Failed to save video");
}

6. 处理权限请求

在 Android 上,你可能需要手动请求权限。你可以使用 permission_handler 插件来请求权限:

import 'package:permission_handler/permission_handler.dart';

Future<void> requestPermissions() async {
  if (await Permission.storage.request().isGranted) {
    await Permission.microphone.request();
  }
}

在开始录制之前调用 requestPermissions 方法:

await requestPermissions();
await screenRecorder.startRecording();

7. 处理异常

在录制过程中,可能会遇到异常。你可以使用 try-catch 块来处理这些异常:

try {
  await screenRecorder.startRecording();
} catch (e) {
  print("Failed to start recording: $e");
}

8. 自定义录制设置

你可以自定义录制的设置,例如视频质量、音频源等。可以通过 ScreenRecorderSettings 类来设置这些参数:

final settings = ScreenRecorderSettings(
  videoQuality: VideoQuality.HIGH,
  enableAudio: true,
);

await screenRecorder.startRecording(settings: settings);

9. 处理录制状态

你可以监听录制状态的变化,例如开始、停止、错误等:

screenRecorder.onRecordingStatusChanged.listen((status) {
  print("Recording status: $status");
});

10. 清理资源

在应用退出或不再需要录制时,确保释放资源:

await screenRecorder.dispose();

示例代码

以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:screen_recorder_7/screen_recorder_7.dart';
import 'package:permission_handler/permission_handler.dart';

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

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

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

class _ScreenRecorderScreenState extends State<ScreenRecorderScreen> {
  final screenRecorder = ScreenRecorder();
  bool isRecording = false;

  Future<void> requestPermissions() async {
    if (await Permission.storage.request().isGranted) {
      await Permission.microphone.request();
    }
  }

  Future<void> startRecording() async {
    try {
      await requestPermissions();
      await screenRecorder.startRecording();
      setState(() {
        isRecording = true;
      });
    } catch (e) {
      print("Failed to start recording: $e");
    }
  }

  Future<void> stopRecording() async {
    try {
      String? videoPath = await screenRecorder.stopRecording();
      setState(() {
        isRecording = false;
      });
      if (videoPath != null) {
        print("Video saved at: $videoPath");
      } else {
        print("Failed to save video");
      }
    } catch (e) {
      print("Failed to stop recording: $e");
    }
  }

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

  [@override](/user/override)
  void dispose() {
    screenRecorder.dispose();
    super.dispose();
  }
}
回到顶部