删除未使用的相机和记录类来重构记录功能;更新pubspec中的依赖项。Yaml为本地插件路径;简化MainActivity和相关类,以提高性能和可维护性。
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
@@ -22,20 +21,20 @@ enum RecordingState {
|
||||
class RecordingStatus {
|
||||
const RecordingStatus({
|
||||
required this.state,
|
||||
this.outputPath,
|
||||
this.streamUrl,
|
||||
this.elapsedMillis = 0,
|
||||
this.message,
|
||||
});
|
||||
|
||||
final RecordingState state;
|
||||
final String? outputPath;
|
||||
final String? streamUrl;
|
||||
final int elapsedMillis;
|
||||
final String? message;
|
||||
|
||||
factory RecordingStatus.fromMap(Map<dynamic, dynamic> map) {
|
||||
return RecordingStatus(
|
||||
state: RecordingState.fromRaw(map['state'] as String?),
|
||||
outputPath: map['outputPath'] as String?,
|
||||
streamUrl: map['streamUrl'] as String?,
|
||||
elapsedMillis: (map['elapsedMillis'] as num?)?.toInt() ?? 0,
|
||||
message: map['message'] as String?,
|
||||
);
|
||||
@@ -50,9 +49,6 @@ class RecordingPlatform {
|
||||
static const MethodChannel _channel = MethodChannel(
|
||||
RecordingChannelNames.method,
|
||||
);
|
||||
static const EventChannel _events = EventChannel(
|
||||
RecordingChannelNames.events,
|
||||
);
|
||||
|
||||
static bool get isSupported =>
|
||||
supportsHost(isAndroid: Platform.isAndroid, isIOS: Platform.isIOS);
|
||||
@@ -61,76 +57,6 @@ class RecordingPlatform {
|
||||
return isAndroid || isIOS;
|
||||
}
|
||||
|
||||
static Stream<RecordingStatus>? _statusStream;
|
||||
|
||||
static Stream<RecordingStatus> statusStream() {
|
||||
if (!isSupported) {
|
||||
return const Stream.empty();
|
||||
}
|
||||
_statusStream ??= _events.receiveBroadcastStream().map(
|
||||
(event) =>
|
||||
RecordingStatus.fromMap(Map<dynamic, dynamic>.from(event as Map)),
|
||||
);
|
||||
return _statusStream!;
|
||||
}
|
||||
|
||||
static Future<RecordingStatus> initializePreview() async {
|
||||
final result = await _channel.invokeMapMethod<String, dynamic>(
|
||||
'initializePreview',
|
||||
);
|
||||
return RecordingStatus.fromMap(result ?? const {});
|
||||
}
|
||||
|
||||
static Future<RecordingZoomCapabilities> getZoomCapabilities() async {
|
||||
final result = await _channel.invokeMapMethod<String, dynamic>(
|
||||
'getZoomCapabilities',
|
||||
);
|
||||
return RecordingZoomCapabilities.fromMap(result);
|
||||
}
|
||||
|
||||
static Future<RecordingZoomCapabilities> setZoomRatio(double ratio) async {
|
||||
final result = await _channel.invokeMapMethod<String, dynamic>(
|
||||
'setZoomRatio',
|
||||
<String, dynamic>{'zoomRatio': ratio},
|
||||
);
|
||||
return RecordingZoomCapabilities.fromMap(result);
|
||||
}
|
||||
|
||||
static Future<RecordingStartResult> startRecording({
|
||||
bool withAudio = true,
|
||||
bool enableDoNotDisturb = true,
|
||||
String? displayName,
|
||||
}) async {
|
||||
final args = <String, dynamic>{
|
||||
'withAudio': withAudio,
|
||||
'enableDoNotDisturb': enableDoNotDisturb,
|
||||
};
|
||||
if (displayName != null) {
|
||||
args['displayName'] = displayName;
|
||||
}
|
||||
|
||||
final result = await _channel.invokeMapMethod<String, dynamic>(
|
||||
'startRecording',
|
||||
args,
|
||||
);
|
||||
return RecordingStartResult(
|
||||
outputPath: result?['outputPath'] as String?,
|
||||
status: RecordingStatus.fromMap(
|
||||
Map<dynamic, dynamic>.from(result?['status'] as Map? ?? const {}),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
static Future<RecordingStopResult> stopRecording() async {
|
||||
final result = await _channel.invokeMapMethod<String, dynamic>(
|
||||
'stopRecording',
|
||||
);
|
||||
return RecordingStopResult.fromMap(result);
|
||||
}
|
||||
|
||||
static Future<void> disposePreview() =>
|
||||
_channel.invokeMethod('disposePreview');
|
||||
|
||||
static Future<bool> hasNotificationPolicyAccess() async {
|
||||
return await _channel.invokeMethod<bool>('hasNotificationPolicyAccess') ??
|
||||
false;
|
||||
@@ -164,71 +90,4 @@ class RecordingPlatform {
|
||||
'enabled': enabled,
|
||||
});
|
||||
}
|
||||
|
||||
static Future<RecordingStatus> getStatus() async {
|
||||
final result = await _channel.invokeMapMethod<String, dynamic>('getStatus');
|
||||
return RecordingStatus.fromMap(result ?? const {});
|
||||
}
|
||||
}
|
||||
|
||||
class RecordingZoomCapabilities {
|
||||
const RecordingZoomCapabilities({
|
||||
required this.zoomRatio,
|
||||
required this.minZoomRatio,
|
||||
required this.maxZoomRatio,
|
||||
});
|
||||
|
||||
final double zoomRatio;
|
||||
final double minZoomRatio;
|
||||
final double maxZoomRatio;
|
||||
|
||||
factory RecordingZoomCapabilities.fromMap(Map<String, dynamic>? map) {
|
||||
final minZoomRatio = (map?['minZoomRatio'] as num?)?.toDouble() ?? 1.0;
|
||||
final maxZoomRatio = (map?['maxZoomRatio'] as num?)?.toDouble() ?? 3.0;
|
||||
final zoomRatio = (map?['zoomRatio'] as num?)?.toDouble() ?? minZoomRatio;
|
||||
return RecordingZoomCapabilities(
|
||||
zoomRatio: zoomRatio.clamp(minZoomRatio, maxZoomRatio).toDouble(),
|
||||
minZoomRatio: minZoomRatio,
|
||||
maxZoomRatio: maxZoomRatio,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class RecordingStartResult {
|
||||
const RecordingStartResult({this.outputPath, required this.status});
|
||||
|
||||
final String? outputPath;
|
||||
final RecordingStatus status;
|
||||
}
|
||||
|
||||
class RecordingStopResult {
|
||||
const RecordingStopResult({
|
||||
this.outputPath,
|
||||
required this.status,
|
||||
this.fileSaved = true,
|
||||
this.fileErrorMessage,
|
||||
this.segmentOutputPaths = const [],
|
||||
});
|
||||
|
||||
final String? outputPath;
|
||||
final RecordingStatus status;
|
||||
final bool fileSaved;
|
||||
final String? fileErrorMessage;
|
||||
final List<String> segmentOutputPaths;
|
||||
|
||||
factory RecordingStopResult.fromMap(Map<String, dynamic>? result) {
|
||||
return RecordingStopResult(
|
||||
outputPath: result?['outputPath'] as String?,
|
||||
status: RecordingStatus.fromMap(
|
||||
Map<dynamic, dynamic>.from(result?['status'] as Map? ?? const {}),
|
||||
),
|
||||
fileSaved: result?['fileSaved'] as bool? ?? true,
|
||||
fileErrorMessage: result?['fileErrorMessage'] as String?,
|
||||
segmentOutputPaths:
|
||||
(result?['segmentOutputPaths'] as List?)?.whereType<String>().toList(
|
||||
growable: false,
|
||||
) ??
|
||||
const [],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user