diff --git a/android/app/src/main/kotlin/com/qxy/dronex/recording/RecordingPlatformHandler.kt b/android/app/src/main/kotlin/com/qxy/dronex/recording/RecordingPlatformHandler.kt index 8ce8657..5961845 100644 --- a/android/app/src/main/kotlin/com/qxy/dronex/recording/RecordingPlatformHandler.kt +++ b/android/app/src/main/kotlin/com/qxy/dronex/recording/RecordingPlatformHandler.kt @@ -161,22 +161,31 @@ class RecordingPlatformHandler( controller.stopRecording { path -> RecordingSession.stopForeground(activity) DoNotDisturbHelper.disable(activity) - mainHandler.post { - val gallerySaved = path != null && controller.status.state != RecordingState.ERROR - val payload = - mutableMapOf( - "outputPath" to path, - "status" to controller.status.toMap(), - "gallerySaved" to gallerySaved, - ) - if (!gallerySaved) { - payload["galleryErrorMessage"] = controller.status.message ?: "保存到相册失败" - } - result.success(payload) + val previewView = activity.recordingPreviewView + if (previewView == null) { + mainHandler.post { deliverStopResult(result, path) } + return@stopRecording + } + controller.rebindForRecording(activity, previewView) { _ -> + mainHandler.post { deliverStopResult(result, path) } } } } + private fun deliverStopResult(result: MethodChannel.Result, path: String?) { + val gallerySaved = path != null && controller.status.state != RecordingState.ERROR + val payload = + mutableMapOf( + "outputPath" to path, + "status" to controller.status.toMap(), + "gallerySaved" to gallerySaved, + ) + if (!gallerySaved) { + payload["galleryErrorMessage"] = controller.status.message ?: "保存到相册失败" + } + result.success(payload) + } + private fun setImmersiveMode(enabled: Boolean) { val window = activity.window WindowCompat.setDecorFitsSystemWindows(window, !enabled) diff --git a/lib/features/recording/view-model/view_model_recording.dart b/lib/features/recording/view-model/view_model_recording.dart index da739d9..4ce5608 100644 --- a/lib/features/recording/view-model/view_model_recording.dart +++ b/lib/features/recording/view-model/view_model_recording.dart @@ -196,6 +196,32 @@ class RecordingViewModel extends Notifier { throw StateError('initializePreview retry exhausted'); } + /// 停止录制后重新绑定相机预览(重置 isPreviewReady 以显示加载遮罩)。 + Future restorePreview() async { + if (!RecordingPlatform.isSupported) return; + + _updateSession((s) => s.copyWith(isPreviewReady: false, errorMessage: null)); + try { + final status = await _initializePreviewWithRetry(); + _updateSession( + (s) => s.copyWith( + status: status, + isPreviewReady: status.state == RecordingState.previewing, + errorMessage: status.state == RecordingState.previewing + ? null + : (status.message ?? '相机预览初始化失败'), + ), + ); + } on PlatformException catch (error) { + _updateSession( + (s) => s.copyWith( + isPreviewReady: false, + errorMessage: error.message ?? '相机预览初始化失败', + ), + ); + } + } + List _galleryPermissions() { if (Platform.isIOS) { return [Permission.photosAddOnly, Permission.photos]; @@ -280,6 +306,8 @@ class RecordingViewModel extends Notifier { _updateSession( (s) => s.copyWith(errorMessage: error.message ?? '停止录制失败'), ); + } finally { + await restorePreview(); } }