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;