From dff0f6fb6b2590e835d91cbd8abd4090ea59dba4 Mon Sep 17 00:00:00 2001 From: lxh2875931338 Date: Sat, 4 Jul 2026 23:55:21 +0800 Subject: [PATCH] =?UTF-8?q?SAF=E5=AE=9E=E7=8E=B0=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battery_health/MainActivity.kt | 8 +- android/gradle.properties | 4 + lib/services/saf_storage_service.dart | 13 +-- linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 80 ++++++++++++++++--- pubspec.yaml | 2 +- .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 10 files changed, 95 insertions(+), 23 deletions(-) rename android/app/src/main/kotlin/com/{example => lxh}/battery_health/MainActivity.kt (95%) diff --git a/android/app/src/main/kotlin/com/example/battery_health/MainActivity.kt b/android/app/src/main/kotlin/com/lxh/battery_health/MainActivity.kt similarity index 95% rename from android/app/src/main/kotlin/com/example/battery_health/MainActivity.kt rename to android/app/src/main/kotlin/com/lxh/battery_health/MainActivity.kt index a2cf677..3c68941 100644 --- a/android/app/src/main/kotlin/com/example/battery_health/MainActivity.kt +++ b/android/app/src/main/kotlin/com/lxh/battery_health/MainActivity.kt @@ -13,7 +13,7 @@ import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { - private val CHANNEL = "com.lxh.battery_health/charge" + private val CHARGE_CHANNEL = "com.lxh.battery_health/charge" private val EVENT_CHANNEL = "com.lxh.battery_health/charge_events" private var eventSink: EventChannel.EventSink? = null @@ -35,7 +35,7 @@ class MainActivity : FlutterActivity() { when (plug) { BatteryManager.BATTERY_PLUGGED_AC -> "AC" BatteryManager.BATTERY_PLUGGED_USB -> "USB" - BatteryManager.BATTERY_PLUGGED_WIRELESS -> "WIRELESS" // 🟢 关键修复 + BatteryManager.BATTERY_PLUGGED_WIRELESS -> "WIRELESS" else -> "UNKNOWN" } } else { @@ -47,7 +47,7 @@ class MainActivity : FlutterActivity() { override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHARGE_CHANNEL).setMethodCallHandler { call, result -> if (call.method == "getChargeState") { val isCharging = getBatteryStatus() val chargeType = if (isCharging) { @@ -56,7 +56,7 @@ class MainActivity : FlutterActivity() { when (plug) { BatteryManager.BATTERY_PLUGGED_AC -> "AC" BatteryManager.BATTERY_PLUGGED_USB -> "USB" - BatteryManager.BATTERY_PLUGGED_WIRELESS -> "WIRELESS" // 🟢 关键修复 + BatteryManager.BATTERY_PLUGGED_WIRELESS -> "WIRELESS" else -> "UNKNOWN" } } else { diff --git a/android/gradle.properties b/android/gradle.properties index f018a61..475a628 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,7 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false diff --git a/lib/services/saf_storage_service.dart b/lib/services/saf_storage_service.dart index 4044751..09493b6 100644 --- a/lib/services/saf_storage_service.dart +++ b/lib/services/saf_storage_service.dart @@ -1,15 +1,17 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:file_picker/file_picker.dart'; import '../models/saf_permission_state.dart'; -/// 使用 file_picker 实现文件夹访问 class SafStorageService { static final SafStorageService _instance = SafStorageService._internal(); factory SafStorageService() => _instance; SafStorageService._internal(); + static const MethodChannel _channel = MethodChannel( + 'com.lxh.battery_health/saf', + ); static const String _prefKeySafPath = 'saf_storage_path'; String? _cachedPath; @@ -40,14 +42,13 @@ class SafStorageService { Future requestPermission() async { try { - // 使用 file_picker 选择文件夹 - String? selectedPath = await FilePicker.platform.getDirectoryPath(); + final String? selectedPath = await _channel.invokeMethod('selectFolder'); if (selectedPath == null || selectedPath.isEmpty) { return SafAuthorizationResult.denied(); } - // 验证路径是否包含 mbattery_charger(可选,提高容错) + // 验证路径是否包含 mbattery_charger if (!selectedPath.contains('mbattery_charger')) { return SafAuthorizationResult.error('请选择 mbattery_charger 文件夹'); } @@ -102,7 +103,7 @@ class SafStorageService { if (!await dir.exists()) return []; final entities = await dir.list().toList(); return entities - .whereType() + .where((e) => e is File) .map((e) => e.path.split(Platform.pathSeparator).last) .toList(); } catch (e) { diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e71a16d..64a0ece 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index be1ee3e..a630fa9 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 852819c..0ad6433 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,11 +6,13 @@ import FlutterMacOS import Foundation import device_info_plus +import file_selector_macos import shared_preferences_foundation import sqflite_darwin func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) } diff --git a/pubspec.lock b/pubspec.lock index a51ba58..9d3f3ff 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -57,6 +57,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.19.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "92c9c43c383bfa1c32079d3bc492d55d6d4318044b7b47edaff8971cbb555c51" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.3.5+4" crypto: dependency: transitive description: @@ -113,14 +121,70 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "7.0.1" - file_picker: + file_selector: dependency: "direct main" description: - name: file_picker - sha256: "1bbf65dd997458a08b531042ec3794112a6c39c07c37ff22113d2e7e4f81d4e4" + name: file_selector + sha256: bd15e43e9268db636b53eeaca9f56324d1622af30e5c34d6e267649758c84d9a url: "https://pub.flutter-io.cn" source: hosted - version: "6.2.1" + version: "1.1.0" + file_selector_android: + dependency: transitive + description: + name: file_selector_android + sha256: "6a26687fa65cbc28a5345c7ae6f227e89f0b47740978a4c475b1a625da7a331b" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.5.2+8" + file_selector_ios: + dependency: transitive + description: + name: file_selector_ios + sha256: e2ecf2885c121691ce13b60db3508f53c01f869fb6e8dc5c1cfa771e4c46aeca + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.5.3+5" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.9.4" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.9.5" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.7.0" + file_selector_web: + dependency: transitive + description: + name: file_selector_web + sha256: "73181fbc5257776d8ecaa6a94ab3c8e920ad143b9132a6d984a9271dfc6928d3" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.9.5" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.9.3+5" flutter: dependency: "direct main" description: flutter @@ -134,14 +198,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "5.0.0" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.35" flutter_svg: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 5aec786..862dca3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -38,7 +38,7 @@ dependencies: path: ^1.9.0 flutter_svg: ^2.0.10+1 shared_preferences: ^2.2.0 - file_picker: ^6.0.0 + file_selector: ^1.0.0 # 🟢 新增 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 48de52b..2c256bd 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,9 +6,12 @@ #include "generated_plugin_registrant.h" +#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); PermissionHandlerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index d6ee74d..5a997e6 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_windows permission_handler_windows )