用户开始录制,拒绝录音录像权限,增加弹窗引导用户前往系统页设置

This commit is contained in:
2026-06-05 16:11:54 +08:00
parent 4d83f38960
commit 54738d53f9
2 changed files with 69 additions and 1 deletions

View File

@@ -31,6 +31,19 @@ enum ClipboardReadResult {
invalid,
}
/// 开始录制所需的相机/麦克风权限检测结果。
class RecordingRequiredPermissions {
const RecordingRequiredPermissions({
required this.cameraGranted,
required this.microphoneGranted,
});
final bool cameraGranted;
final bool microphoneGranted;
bool get allGranted => cameraGranted && microphoneGranted;
}
/// 录制页 ViewModel剪贴板、权限、相机预览与录制流程。
class RecordingViewModel extends Notifier<RecordingModel> {
static final _defaultClipboard = ClipboardRecordingModel(
@@ -253,6 +266,30 @@ class RecordingViewModel extends Notifier<RecordingModel> {
return _galleryPermissions().isEmpty;
}
/// 检测并尝试申请相机、麦克风权限,同步更新 session 中的 isMicrophoneGranted。
Future<RecordingRequiredPermissions> ensureCameraAndMicrophonePermissions() async {
final permissions = await PermissionService.requestMissing([
Permission.camera,
Permission.microphone,
]);
final cameraGranted = _isPermissionGranted(permissions[Permission.camera]);
final microphoneGranted = _isPermissionGranted(
permissions[Permission.microphone],
);
_updateSession((s) => s.copyWith(isMicrophoneGranted: microphoneGranted));
return RecordingRequiredPermissions(
cameraGranted: cameraGranted,
microphoneGranted: microphoneGranted,
);
}
bool _isPermissionGranted(PermissionStatus? status) {
return status?.isGranted == true || status?.isLimited == true;
}
/// 开始录制,可选开启勿扰模式。
Future<void> startRecording({bool enableDoNotDisturb = true}) async {
final session = state.session;