diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 4e58ed2..c2ff064 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -36,6 +36,10 @@ + + + diff --git a/lib/common/permission/PermissionUtil.dart b/lib/common/permission/PermissionUtil.dart new file mode 100644 index 0000000..c27fbd3 --- /dev/null +++ b/lib/common/permission/PermissionUtil.dart @@ -0,0 +1,124 @@ + +import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:permission_handler/permission_handler.dart'; + +///权限检测工具 +class PermissionUtil { + static defaultCall(name) { + EasyLoading.showToast(name); + } + + /// 检测石是否有权限 + /// [permissionList] 权限申请列表 + /// [errMsg] 错误信息 + /// [onSuccess] 全部成功 + /// [onFailed] 有一个失败 + /// [goSetting] 前往设置 + static checkPermission( + {required List permissionList, + String? errMsg, + VoidCallback? onSuccess, + VoidCallback? onFailed, + VoidCallback? goSetting}) async { + ///一个新待申请权限列表 + List newPermissionList = []; + + ///遍历当前权限申请列表 + for (Permission permission in permissionList) { + PermissionStatus status = await permission.status; + + ///如果不是允许状态就添加到新的申请列表中 + if (!status.isGranted) { + newPermissionList.add(permission); + } + } + + ///如果需要重新申请的列表不是空的 + if (newPermissionList.isNotEmpty) { + PermissionStatus permissionStatus = + await requestPermission(newPermissionList); + + switch (permissionStatus) { + + ///拒绝状态 + case PermissionStatus.denied: + onFailed != null ? onFailed() : defaultCall("权限申请失败"); + break; + + ///允许状态 + case PermissionStatus.granted: + onSuccess != null ? onSuccess() : defaultCall("权限申请成功"); + break; + + /// 永久拒绝 活动限制 + case PermissionStatus.restricted: + case PermissionStatus.limited: + case PermissionStatus.permanentlyDenied: + case PermissionStatus.provisional: + goSetting != null + ? goSetting( ) + :await openAppSettings(); + break; + } + } else { + onSuccess != null ? onSuccess() : defaultCall("权限申请成功"); + } + } + + /// 获取新列表中的权限 如果有一项不合格就返回false + static requestPermission(List permissionList) async { + Map statuses = await permissionList.request(); + PermissionStatus currentPermissionStatus = PermissionStatus.granted; + statuses.forEach((key, value) { + if (!value.isGranted) { + currentPermissionStatus = value; + return; + } + }); + return currentPermissionStatus; + } + + static checkLocationAlways( + {VoidCallback? onSuccess, + VoidCallback? onFailed, + VoidCallback? goSetting}) async { + ///获取前置状态 + /// Android没有这一步 ios会先访问这个再访问其他的 + PermissionStatus status = PermissionStatus.granted; + status = await _checkSinglePermission(Permission.locationWhenInUse); + + ///获取第二个状态 + PermissionStatus status2 = PermissionStatus.denied; + + ///如果前置状态为成功才能执行获取第二个状态 + if (status.isGranted) { + status2 = await _checkSinglePermission(Permission.locationAlways); + } + + ///如果两个都成功那么就返回成功 + if (status.isGranted && status2.isGranted) { + onSuccess != null ? onSuccess() : defaultCall("权限申请成功"); + + ///如果有一个拒绝那么就失败了 + } else if (status.isDenied || status2.isDenied) { + onFailed != null ? onFailed() : defaultCall("权限申请失败"); + } else { + goSetting != null ? goSetting() : await openAppSettings(); + } + } + + static _checkSinglePermission(Permission permission) async { + ///获取当前状态 + PermissionStatus status = await permission.status; + PermissionStatus currentPermissionStatus = PermissionStatus.granted; + + ///如果它状态不是允许那么就去获取 + if (!status.isGranted) { + currentPermissionStatus = await requestPermission([permission]); + } + + ///返回最终状态 + return currentPermissionStatus; + } +} diff --git a/lib/pages/reading/permissionRequestPage.dart b/lib/common/permission/permissionRequestPage.dart index cffeb24..c99702a 100644 --- a/lib/pages/reading/permissionRequestPage.dart +++ b/lib/common/permission/permissionRequestPage.dart @@ -16,8 +16,7 @@ Future permissionCheckAndRequest( {bool isRequiredPermission = false}) async { if (!await permission.status.isGranted) { await Navigator.of(context).push(PageRouteBuilder( - opaque: true, - barrierColor: const Color.fromRGBO(255, 0, 0, 0.7), + opaque: false, pageBuilder: ((context, animation, secondaryAnimation) { return PermissionRequestPage(permission, permissionTypeStr, isRequiredPermission: isRequiredPermission); diff --git a/lib/pages/reading/bloc/reading_bloc.dart b/lib/pages/reading/bloc/reading_bloc.dart index e4f933f..071c33c 100644 --- a/lib/pages/reading/bloc/reading_bloc.dart +++ b/lib/pages/reading/bloc/reading_bloc.dart @@ -14,7 +14,7 @@ import '../../../models/course_process_entity.dart'; import '../../../utils/loading.dart'; import '../../../utils/log_util.dart'; -import '../permissionRequestPage.dart'; +import '../../../common/permission/permissionRequestPage.dart'; part 'reading_event.dart'; part 'reading_state.dart'; diff --git a/lib/pages/user/modify/user_avatar_bloc/user_avatar_bloc.dart b/lib/pages/user/modify/user_avatar_bloc/user_avatar_bloc.dart index 9347a7e..5a4f6ce 100644 --- a/lib/pages/user/modify/user_avatar_bloc/user_avatar_bloc.dart +++ b/lib/pages/user/modify/user_avatar_bloc/user_avatar_bloc.dart @@ -1,3 +1,6 @@ +import 'dart:io'; + +import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; @@ -99,7 +102,17 @@ class UserAvatarBloc extends Bloc { ///获取相册权限 Future getPhotoPermissionStatus() async { - Permission permission = Permission.photos; + Permission permission; + if (Platform.isAndroid) { + final androidInfo = await DeviceInfoPlugin().androidInfo; + if (androidInfo.version.sdkInt <= 32) { + permission = Permission.storage; + } else { + permission = Permission.photos; + } + } else { + permission = Permission.photos; + } PermissionStatus status = await permission.status; if (status.isGranted) { return true;