Преглед изворни кода

权限库与Album库的升级与修改

liukai пре 3 недеља
родитељ
комит
78de3eac47

+ 4 - 25
app/android/app/src/main/kotlin/com/hongyegroup/property_management/MainActivity.java

@@ -11,6 +11,7 @@ import androidx.annotation.Nullable;
 import io.flutter.embedding.android.FlutterActivity;
 import io.flutter.embedding.engine.FlutterEngine;
 import io.flutter.plugin.common.MethodChannel;
+import android.os.Build;
 
 public class MainActivity extends FlutterActivity {
 
@@ -30,31 +31,9 @@ public class MainActivity extends FlutterActivity {
         MethodChannel methodChannel = new MethodChannel(flutterEngine.getDartExecutor(), "com.room/opapp");
 
         methodChannel.setMethodCallHandler((call, result) -> {
-            //检查人脸数量
-           if (call.method.equals("bringAppToForeground")) {
-                //启动MainActivity自己
-                Log.d("MainActivity", "执行 methodChannel -> bringAppToForeground");
-
-//                Intent intent = new Intent(this, MainActivity.class);
-//                intent.setAction(Intent.ACTION_MAIN);
-//                intent.addCategory(Intent.CATEGORY_LAUNCHER);
-//                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-//                intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
-//                startActivity(intent);
-
-//                ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
-//                List<ActivityManager.AppTask> appTasks = activityManager.getAppTasks();
-//                if (!appTasks.isEmpty()) {
-//                    appTasks.get(0).moveToFront();
-//                }
-
-//                PackageManager packageManager = getPackageManager();
-//                Intent intent = packageManager.getLaunchIntentForPackage("com.hongyegroup.zhurijob");
-//                if (intent != null) {
-//                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-//                    startActivity(intent);
-//                }
-
+            //返回安卓版本
+           if (call.method.equals("getAndroidSdkInt")) {
+               result.success(Build.VERSION.SDK_INT);
             } else if (call.method.equals("getNativeRouterName")) {
                 // 获取当前需要跳转的子路由
                 Log.d("MainActivity", "执行 methodChannel -> getNativeRouterName");

+ 19 - 0
packages/cs_plugin_platform/lib/channel/native_version_channel.dart

@@ -0,0 +1,19 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+
+class NativeVersionChannel {
+  //初始化MethodChannel对象
+  static const MethodChannel _channel = MethodChannel('com.room/opapp');
+
+  /// 获取 原生系统 版本号 如安卓的11
+  static Future<int> getAndroidSdkInt() async {
+    if (defaultTargetPlatform != TargetPlatform.android) return 0; // 非Android设备返回0
+    try {
+      final version = await _channel.invokeMethod<int>('getAndroidSdkInt');
+      return version ?? 0;
+    } on PlatformException catch (e) {
+      print("获取 Android 版本失败: ${e.message}");
+      return 0;
+    }
+  }
+}

+ 7 - 7
packages/cs_plugin_platform/lib/engine/image/image_nine_grid.dart

@@ -44,13 +44,13 @@ class _ImageNineGridState extends State<ImageNineGrid> {
     _images = List.from(widget.initialImages);
   }
 
-  @override
-  void didUpdateWidget(covariant ImageNineGrid oldWidget) {
-    super.didUpdateWidget(oldWidget);
-    if (oldWidget.initialImages != widget.initialImages) {
-      _images = List.from(widget.initialImages);
-    }
-  }
+  // @override  //判断是否需要刷新,逻辑有问题导致无法显示新加入的
+  // void didUpdateWidget(covariant ImageNineGrid oldWidget) {
+  //   super.didUpdateWidget(oldWidget);
+  //   if (oldWidget.initialImages != widget.initialImages) {
+  //     _images = List.from(widget.initialImages);
+  //   }
+  // }
 
   // 选择图片
   Future<void> _pickImage() async {

+ 74 - 47
packages/cs_plugin_platform/lib/engine/media/album_engine.dart

@@ -1,3 +1,4 @@
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:wechat_assets_picker/wechat_assets_picker.dart';
@@ -16,6 +17,8 @@ class AlbumEngine {
     int filterMinHeight = 100,
     int filterMaxHeight = 100000,
   }) async {
+    const Color themeColor = Color(0xff00bc56);
+
     FilterOptionGroup filterOptions = FilterOptionGroup()
       ..setOption(
         AssetType.image,
@@ -39,54 +42,12 @@ class AlbumEngine {
         gridCount: 4,
         pageSize: 40,
         pickerTheme: ThemeData(
+          primaryColor: themeColor,
+          primaryColorDark: Colors.white,
+          primaryColorLight: themeColor,
           brightness: Brightness.dark,
-          appBarTheme: AppBarTheme(
-            systemOverlayStyle: SystemUiOverlayStyle.dark.copyWith(
-                    statusBarColor: Colors.transparent,
-                    statusBarBrightness: Brightness.dark,
-                    statusBarIconBrightness: Brightness.light,
-                  ),
-          ),
-        ),
-      ),
-    );
-  }
-
-  /// 选择视频
-  static Future<List<AssetEntity>?> selectVideo(
-    BuildContext context, {
-    int maxAssets = 1,
-    List<AssetEntity>? selected,
-    int filterMinWidth = 100,
-    int filterMaxWidth = 100000,
-    int filterMinHeight = 100,
-    int filterMaxHeight = 100000,
-    int filterMaxSeconds = 60, //默认能选择60秒以内的视频
-  }) async {
-    FilterOptionGroup filterOptions = FilterOptionGroup()
-      ..setOption(
-        AssetType.video,
-        FilterOption(
-            sizeConstraint: SizeConstraint(
-              minWidth: filterMinWidth,
-              maxWidth: filterMaxWidth,
-              minHeight: filterMinHeight,
-              maxHeight: filterMaxHeight,
-            ),
-            durationConstraint: DurationConstraint(max: Duration(seconds: filterMaxSeconds))),
-      );
-
-    return AssetPicker.pickAssets(
-      context,
-      pickerConfig: AssetPickerConfig(
-        requestType: RequestType.video,
-        selectedAssets: selected,
-        maxAssets: maxAssets,
-        filterOptions: filterOptions,
-        gridCount: 4,
-        pageSize: 40,
-        pickerTheme: ThemeData(
-          brightness: Brightness.dark,
+          primarySwatch: _createMaterialColor(themeColor),
+          textSelectionTheme: const TextSelectionThemeData(cursorColor: themeColor),
           appBarTheme: AppBarTheme(
             systemOverlayStyle: SystemUiOverlayStyle.dark.copyWith(
               statusBarColor: Colors.transparent,
@@ -98,4 +59,70 @@ class AlbumEngine {
       ),
     );
   }
+
+  static MaterialColor _createMaterialColor(Color color) {
+    final strengths = <double>[.05];
+    final swatch = <int, Color>{};
+    for (int i = 1; i < 10; i++) {
+      strengths.add(0.1 * i);
+    }
+
+    for (final strength in strengths) {
+      final double ds = 0.5 - strength;
+      swatch[(strength * 1000).round()] = Color.fromRGBO(
+        color.red + ((ds < 0 ? color.red : (255 - color.red)) * ds).round(),
+        color.green + ((ds < 0 ? color.green : (255 - color.green)) * ds).round(),
+        color.blue + ((ds < 0 ? color.blue : (255 - color.blue)) * ds).round(),
+        1,
+      );
+    }
+    return MaterialColor(color.value, swatch);
+  }
+
+  /// 选择视频
+// static Future<List<AssetEntity>?> selectVideo(
+//   BuildContext context, {
+//   int maxAssets = 1,
+//   List<AssetEntity>? selected,
+//   int filterMinWidth = 100,
+//   int filterMaxWidth = 100000,
+//   int filterMinHeight = 100,
+//   int filterMaxHeight = 100000,
+//   int filterMaxSeconds = 60, //默认能选择60秒以内的视频
+// }) async {
+//   FilterOptionGroup filterOptions = FilterOptionGroup()
+//     ..setOption(
+//       AssetType.video,
+//       FilterOption(
+//           sizeConstraint: SizeConstraint(
+//             minWidth: filterMinWidth,
+//             maxWidth: filterMaxWidth,
+//             minHeight: filterMinHeight,
+//             maxHeight: filterMaxHeight,
+//           ),
+//           durationConstraint: DurationConstraint(max: Duration(seconds: filterMaxSeconds))),
+//     );
+//
+//   return AssetPicker.pickAssets(
+//     context,
+//     pickerConfig: AssetPickerConfig(
+//       requestType: RequestType.video,
+//       selectedAssets: selected,
+//       maxAssets: maxAssets,
+//       filterOptions: filterOptions,
+//       gridCount: 4,
+//       pageSize: 40,
+//       pickerTheme: ThemeData(
+//         brightness: Brightness.dark,
+//         appBarTheme: AppBarTheme(
+//           systemOverlayStyle: SystemUiOverlayStyle.dark.copyWith(
+//             statusBarColor: Colors.transparent,
+//             statusBarBrightness: Brightness.dark,
+//             statusBarIconBrightness: Brightness.light,
+//           ),
+//         ),
+//       ),
+//     ),
+//   );
+// }
 }

+ 1 - 1
packages/cs_plugin_platform/lib/engine/media/image_picker_utils.dart

@@ -56,7 +56,7 @@ class ImagePickerUtils {
         }));
   }
 
-  /// 从相机中选择
+  /// 从摄像头拍摄
   Future _selectFormCamera(
     BuildContext context,
     void Function(String filePath) complete, {

+ 33 - 4
packages/cs_plugin_platform/lib/engine/permission/permission_engine.dart

@@ -6,6 +6,7 @@ import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/dialog/app_default_dialog.dart';
 import 'package:widgets/dialog/permission_desc_dialog.dart';
 
+import '../../channel/native_version_channel.dart';
 import '../dialog/dialog_engine.dart';
 
 /*
@@ -49,9 +50,25 @@ class PermissionEngine {
         );
       }
     } else {
-      //Android是否有SD卡权限
-      var status = await Permission.storage.status;
+      //Android的图片选择权限校验,
+      final androidSdkInt = await NativeVersionChannel.getAndroidSdkInt();
+
+      //根据Android版本判断
+      Permission permission;
+      if (androidSdkInt >= 33) {
+        // Android 13 (Tiramisu) 及以上
+        permission = Permission.mediaLibrary;
+      } else if (androidSdkInt >= 29) {
+        // Android 10 (Q) 及以上
+        permission = Permission.photos;
+      } else {
+        permission = Permission.storage;
+      }
+      final status = await permission.status;
+
+      Log.d("status:$status  androidSdkInt:$androidSdkInt");
       late PermissionState ps;
+
       if (status.isGranted) {
         // 已经授权
         success();
@@ -69,7 +86,8 @@ class PermissionEngine {
         if (firstCompleted == 'delay') {
           Log.d("判断响应结果:1");
           // 如果是延迟Future完成了,表示500毫秒内没有获得权限响应,显示对话框
-          _showPermissionDialog("“YYHome” would like to access your multimedia album for functions such as image uploading and saving. Please allow me to obtain your permission");
+          _showPermissionDialog(
+              "“YYHome” would like to access your multimedia album for functions such as image uploading and saving. Please allow me to obtain your permission");
           // 再次等待权限请求结果
           ps = await permissionRequestFuture;
           DialogEngine.dismiss(tag: "permission");
@@ -98,6 +116,16 @@ class PermissionEngine {
     }
   }
 
+  // 检查是否有可访问媒体
+  Future<bool> _checkMediaAccess() async {
+    try {
+      final albums = await PhotoManager.getAssetPathList();
+      return albums.isNotEmpty;
+    } catch (e) {
+      return false;
+    }
+  }
+
   /// 申请相机权限
   void requestCameraPermission(void Function() success) async {
     // 获取当前的权限
@@ -118,7 +146,8 @@ class PermissionEngine {
       // 判断响应结果
       if (firstCompleted == 'delay') {
         // 如果是延迟Future完成了,表示500毫秒内没有获得权限响应,显示对话框
-        _showPermissionDialog("“YYHome” requests to use your camera permission for functions such as taking avatars, uploading and saving images. Please allow me to obtain your permission");
+        _showPermissionDialog(
+            "“YYHome” requests to use your camera permission for functions such as taking avatars, uploading and saving images. Please allow me to obtain your permission");
         // 再次等待权限请求结果
         status = await permissionRequestFuture;
         DialogEngine.dismiss(tag: "permission");

+ 2 - 2
packages/cs_plugin_platform/pubspec.yaml

@@ -35,7 +35,7 @@ dependencies:
   dio: 5.3.3
 
   #处理权限
-  permission_handler: 11.3.1
+  permission_handler: 12.0.0+1
 
   # 图片选择  https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/main/README-ZH.md
   wechat_assets_picker: ^9.2.2
@@ -45,7 +45,7 @@ dependencies:
 
   # 相机选择器 https://github.com/fluttercandies/flutter_wechat_camera_picker/blob/main/README-ZH.md
   # 与上面图片选择配套的相机模块,基于 wechat_assets_picker 与 camera 依赖实现的
-  wechat_camera_picker: ^4.3.4
+  wechat_camera_picker: ^4.3.7
 
   # 图片裁剪  https://github.com/hnvn/flutter_image_cropper
   # 与上面图片选择或相机拍照结合使用,裁剪图片为1:1或4:3或16:9的比例