Skip to content

Commit 24683d1

Browse files
committed
CameraPickerConfig.permissionRequestOption
1 parent db098f5 commit 24683d1

File tree

2 files changed

+34
-10
lines changed

2 files changed

+34
-10
lines changed

lib/src/constants/config.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ final class CameraPickerConfig {
4444
this.onXFileCaptured,
4545
this.onMinimumRecordDurationNotMet,
4646
this.onPickConfirmed,
47+
this.permissionRequestOption,
4748
}) : assert(
4849
enableRecording == true || onlyEnableRecording != true,
4950
'Recording mode error.',
@@ -171,4 +172,9 @@ final class CameraPickerConfig {
171172
/// The callback when the picture or the video is confirmed as picked.
172173
/// 拍照或录像确认时的回调方法。
173174
final void Function(AssetEntity)? onPickConfirmed;
175+
176+
/// The permission request option when saving the captured file using
177+
/// the `photo_manager` package.
178+
/// 使用 `photo_manager` 保存拍摄的文件的权限请求配置。
179+
final PermissionRequestOption? permissionRequestOption;
174180
}

lib/src/states/camera_picker_viewer_state.dart

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:path/path.dart' as path;
1111
import 'package:video_player/video_player.dart';
1212
import 'package:wechat_picker_library/wechat_picker_library.dart';
1313

14+
import '../constants/config.dart';
1415
import '../internals/singleton.dart';
1516
import '../constants/enums.dart';
1617
import '../constants/type_defs.dart';
@@ -19,12 +20,14 @@ import '../widgets/camera_picker.dart';
1920
import '../widgets/camera_picker_viewer.dart';
2021

2122
class CameraPickerViewerState extends State<CameraPickerViewer> {
23+
CameraPickerConfig get pickerConfig => widget.pickerConfig;
24+
2225
/// Whether the player is playing.
2326
/// 播放器是否在播放
24-
final ValueNotifier<bool> isPlaying = ValueNotifier<bool>(false);
27+
final isPlaying = ValueNotifier<bool>(false);
2528

26-
late final ThemeData theme = widget.pickerConfig.theme ??
27-
CameraPicker.themeData(defaultThemeColorWeChat);
29+
late final theme =
30+
pickerConfig.theme ?? CameraPicker.themeData(defaultThemeColorWeChat);
2831

2932
/// Construct an [File] instance through [previewXFile].
3033
/// 通过 [previewXFile] 构建 [File] 实例。
@@ -49,7 +52,7 @@ class CameraPickerViewerState extends State<CameraPickerViewer> {
4952
/// Whether the saving process is ongoing.
5053
bool isSavingEntity = false;
5154

52-
CameraErrorHandler? get onError => widget.pickerConfig.onError;
55+
CameraErrorHandler? get onError => pickerConfig.onError;
5356

5457
@override
5558
void initState() {
@@ -73,7 +76,7 @@ class CameraPickerViewerState extends State<CameraPickerViewer> {
7376
await videoController.initialize();
7477
videoController.addListener(videoControllerListener);
7578
hasLoaded = true;
76-
if (widget.pickerConfig.shouldAutoPreviewVideo) {
79+
if (pickerConfig.shouldAutoPreviewVideo) {
7780
videoController.play();
7881
videoController.setLooping(true);
7982
}
@@ -129,9 +132,9 @@ class CameraPickerViewerState extends State<CameraPickerViewer> {
129132
});
130133

131134
// Handle the explicitly entity saving method.
132-
if (widget.pickerConfig.onEntitySaving != null) {
135+
if (pickerConfig.onEntitySaving != null) {
133136
try {
134-
await widget.pickerConfig.onEntitySaving!(
137+
await pickerConfig.onEntitySaving!(
135138
context,
136139
widget.viewType,
137140
File(widget.previewXFile.path),
@@ -148,7 +151,23 @@ class CameraPickerViewerState extends State<CameraPickerViewer> {
148151

149152
AssetEntity? entity;
150153
try {
151-
final PermissionState ps = await PhotoManager.requestPermissionExtend();
154+
final ps = await PhotoManager.requestPermissionExtend(
155+
requestOption: pickerConfig.permissionRequestOption ??
156+
PermissionRequestOption(
157+
iosAccessLevel: IosAccessLevel.addOnly,
158+
androidPermission: AndroidPermission(
159+
type: switch ((
160+
pickerConfig.enableRecording,
161+
pickerConfig.enableTapRecording
162+
)) {
163+
(true, false) => RequestType.common,
164+
(true, true) => RequestType.video,
165+
(false, _) => RequestType.image,
166+
},
167+
mediaLocation: false,
168+
),
169+
),
170+
);
152171
if (ps == PermissionState.authorized || ps == PermissionState.limited) {
153172
final filePath = previewFile.path;
154173
switch (widget.viewType) {
@@ -165,8 +184,7 @@ class CameraPickerViewerState extends State<CameraPickerViewer> {
165184
);
166185
break;
167186
}
168-
if (widget.pickerConfig.shouldDeletePreviewFile &&
169-
previewFile.existsSync()) {
187+
if (pickerConfig.shouldDeletePreviewFile && previewFile.existsSync()) {
170188
previewFile.delete().catchError((e, s) {
171189
handleErrorWithHandler(e, s, onError);
172190
return previewFile;

0 commit comments

Comments
 (0)