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
更多关于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();
}
}