Commit 20345cbf74920d49af04cc9fa806c09538267ad8

Authored by 吴启风
1 parent b2dd7a7c

feat:修改头像权限android端优化(权限申请流程还有待优化)

android/app/src/main/AndroidManifest.xml
... ... @@ -36,6 +36,10 @@
36 36 <uses-permission android:name="android.permission.RECORD_AUDIO" />
37 37 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
38 38 tools:ignore="ScopedStorage" />
  39 + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
  40 + android:maxSdkVersion="32" />
39 41 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
40 42 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  43 + <uses-permission android:name="android.permission.CAMERA" />
  44 + <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
41 45 </manifest>
... ...
lib/common/permission/PermissionUtil.dart 0 → 100644
  1 +
  2 +import 'package:flutter/material.dart';
  3 +import 'package:flutter_easyloading/flutter_easyloading.dart';
  4 +import 'package:permission_handler/permission_handler.dart';
  5 +
  6 +///权限检测工具
  7 +class PermissionUtil {
  8 + static defaultCall(name) {
  9 + EasyLoading.showToast(name);
  10 + }
  11 +
  12 + /// 检测石是否有权限
  13 + /// [permissionList] 权限申请列表
  14 + /// [errMsg] 错误信息
  15 + /// [onSuccess] 全部成功
  16 + /// [onFailed] 有一个失败
  17 + /// [goSetting] 前往设置
  18 + static checkPermission(
  19 + {required List<Permission> permissionList,
  20 + String? errMsg,
  21 + VoidCallback? onSuccess,
  22 + VoidCallback? onFailed,
  23 + VoidCallback? goSetting}) async {
  24 + ///一个新待申请权限列表
  25 + List<Permission> newPermissionList = [];
  26 +
  27 + ///遍历当前权限申请列表
  28 + for (Permission permission in permissionList) {
  29 + PermissionStatus status = await permission.status;
  30 +
  31 + ///如果不是允许状态就添加到新的申请列表中
  32 + if (!status.isGranted) {
  33 + newPermissionList.add(permission);
  34 + }
  35 + }
  36 +
  37 + ///如果需要重新申请的列表不是空的
  38 + if (newPermissionList.isNotEmpty) {
  39 + PermissionStatus permissionStatus =
  40 + await requestPermission(newPermissionList);
  41 +
  42 + switch (permissionStatus) {
  43 +
  44 + ///拒绝状态
  45 + case PermissionStatus.denied:
  46 + onFailed != null ? onFailed() : defaultCall("权限申请失败");
  47 + break;
  48 +
  49 + ///允许状态
  50 + case PermissionStatus.granted:
  51 + onSuccess != null ? onSuccess() : defaultCall("权限申请成功");
  52 + break;
  53 +
  54 + /// 永久拒绝 活动限制
  55 + case PermissionStatus.restricted:
  56 + case PermissionStatus.limited:
  57 + case PermissionStatus.permanentlyDenied:
  58 + case PermissionStatus.provisional:
  59 + goSetting != null
  60 + ? goSetting( )
  61 + :await openAppSettings();
  62 + break;
  63 + }
  64 + } else {
  65 + onSuccess != null ? onSuccess() : defaultCall("权限申请成功");
  66 + }
  67 + }
  68 +
  69 + /// 获取新列表中的权限 如果有一项不合格就返回false
  70 + static requestPermission(List<Permission> permissionList) async {
  71 + Map<Permission, PermissionStatus> statuses = await permissionList.request();
  72 + PermissionStatus currentPermissionStatus = PermissionStatus.granted;
  73 + statuses.forEach((key, value) {
  74 + if (!value.isGranted) {
  75 + currentPermissionStatus = value;
  76 + return;
  77 + }
  78 + });
  79 + return currentPermissionStatus;
  80 + }
  81 +
  82 + static checkLocationAlways(
  83 + {VoidCallback? onSuccess,
  84 + VoidCallback? onFailed,
  85 + VoidCallback? goSetting}) async {
  86 + ///获取前置状态
  87 + /// Android没有这一步 ios会先访问这个再访问其他的
  88 + PermissionStatus status = PermissionStatus.granted;
  89 + status = await _checkSinglePermission(Permission.locationWhenInUse);
  90 +
  91 + ///获取第二个状态
  92 + PermissionStatus status2 = PermissionStatus.denied;
  93 +
  94 + ///如果前置状态为成功才能执行获取第二个状态
  95 + if (status.isGranted) {
  96 + status2 = await _checkSinglePermission(Permission.locationAlways);
  97 + }
  98 +
  99 + ///如果两个都成功那么就返回成功
  100 + if (status.isGranted && status2.isGranted) {
  101 + onSuccess != null ? onSuccess() : defaultCall("权限申请成功");
  102 +
  103 + ///如果有一个拒绝那么就失败了
  104 + } else if (status.isDenied || status2.isDenied) {
  105 + onFailed != null ? onFailed() : defaultCall("权限申请失败");
  106 + } else {
  107 + goSetting != null ? goSetting() : await openAppSettings();
  108 + }
  109 + }
  110 +
  111 + static _checkSinglePermission(Permission permission) async {
  112 + ///获取当前状态
  113 + PermissionStatus status = await permission.status;
  114 + PermissionStatus currentPermissionStatus = PermissionStatus.granted;
  115 +
  116 + ///如果它状态不是允许那么就去获取
  117 + if (!status.isGranted) {
  118 + currentPermissionStatus = await requestPermission([permission]);
  119 + }
  120 +
  121 + ///返回最终状态
  122 + return currentPermissionStatus;
  123 + }
  124 +}
... ...
lib/pages/reading/permissionRequestPage.dart renamed to lib/common/permission/permissionRequestPage.dart
... ... @@ -16,8 +16,7 @@ Future&lt;bool&gt; permissionCheckAndRequest(
16 16 {bool isRequiredPermission = false}) async {
17 17 if (!await permission.status.isGranted) {
18 18 await Navigator.of(context).push(PageRouteBuilder(
19   - opaque: true,
20   - barrierColor: const Color.fromRGBO(255, 0, 0, 0.7),
  19 + opaque: false,
21 20 pageBuilder: ((context, animation, secondaryAnimation) {
22 21 return PermissionRequestPage(permission, permissionTypeStr,
23 22 isRequiredPermission: isRequiredPermission);
... ...
lib/pages/reading/bloc/reading_bloc.dart
... ... @@ -14,7 +14,7 @@ import &#39;../../../models/course_process_entity.dart&#39;;
14 14 import '../../../utils/loading.dart';
15 15  
16 16 import '../../../utils/log_util.dart';
17   -import '../permissionRequestPage.dart';
  17 +import '../../../common/permission/permissionRequestPage.dart';
18 18  
19 19 part 'reading_event.dart';
20 20 part 'reading_state.dart';
... ...
lib/pages/user/modify/user_avatar_bloc/user_avatar_bloc.dart
  1 +import 'dart:io';
  2 +
  3 +import 'package:device_info_plus/device_info_plus.dart';
1 4 import 'package:flutter/cupertino.dart';
2 5 import 'package:flutter_bloc/flutter_bloc.dart';
3 6 import 'package:flutter_easyloading/flutter_easyloading.dart';
... ... @@ -99,7 +102,17 @@ class UserAvatarBloc extends Bloc&lt;UserAvatarEvent, UserAvatarState&gt; {
99 102  
100 103 ///获取相册权限
101 104 Future<bool> getPhotoPermissionStatus() async {
102   - Permission permission = Permission.photos;
  105 + Permission permission;
  106 + if (Platform.isAndroid) {
  107 + final androidInfo = await DeviceInfoPlugin().androidInfo;
  108 + if (androidInfo.version.sdkInt <= 32) {
  109 + permission = Permission.storage;
  110 + } else {
  111 + permission = Permission.photos;
  112 + }
  113 + } else {
  114 + permission = Permission.photos;
  115 + }
103 116 PermissionStatus status = await permission.status;
104 117 if (status.isGranted) {
105 118 return true;
... ...