diff --git a/lib/services/saf_storage_service.dart b/lib/services/saf_storage_service.dart index 96e7d4d..3663d0b 100644 --- a/lib/services/saf_storage_service.dart +++ b/lib/services/saf_storage_service.dart @@ -3,6 +3,8 @@ import 'package:flutter/services.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../models/saf_permission_state.dart'; +/// SAF 存储服务 +/// 负责管理通过 SAF 授权的文件夹访问 class SafStorageService { static final SafStorageService _instance = SafStorageService._internal(); factory SafStorageService() => _instance; @@ -14,7 +16,7 @@ class SafStorageService { static const String _prefKeySafUri = 'saf_storage_uri'; String? _cachedUri; - // 🟢 初始化时从 SharedPreferences 恢复 URI + /// 初始化,从 SharedPreferences 恢复 URI Future init() async { try { final prefs = await SharedPreferences.getInstance(); @@ -30,14 +32,16 @@ class SafStorageService { } } + /// 获取当前授权状态(简化版,直接根据缓存判断) Future getPermissionState() async { if (_cachedUri == null || _cachedUri!.isEmpty) { return SafPermissionState.unauthorized; } - // 🟢 直接返回 authorized,相信缓存 + // 直接返回 authorized,相信缓存 return SafPermissionState.authorized; } + /// 请求 SAF 授权(引导用户选择文件夹) Future requestPermission() async { try { final String? uriString = await _channel.invokeMethod('selectFolder'); @@ -62,23 +66,57 @@ class SafStorageService { } } + /// 🟢 将 URI 传递给 Kotlin 端(用于恢复 safUri) + Future restoreUri() async { + if (_cachedUri == null || _cachedUri!.isEmpty) { + if (kDebugMode) { + print('[SAF] restoreUri: 缓存 URI 为空'); + } + return false; + } + try { + final bool? result = await _channel.invokeMethod('restoreUri', { + 'uri': _cachedUri, + }); + if (result == true) { + if (kDebugMode) { + print('[SAF] restoreUri 成功: $_cachedUri'); + } + return true; + } else { + if (kDebugMode) { + print('[SAF] restoreUri 失败: 返回 false'); + } + return false; + } + } catch (e) { + if (kDebugMode) { + print('[SAF] restoreUri 异常: $e'); + } + return false; + } + } + + /// 检查指定日期的日志文件是否存在 Future logFileExists(String fileName) async { final state = await getPermissionState(); if (state != SafPermissionState.authorized) return false; try { - final files = await _channel.invokeMethod('listFiles'); - if (files is List) { - return files.contains(fileName); - } - return false; + final files = await listFiles(); + return files.contains(fileName); } catch (e) { return false; } } + /// 读取日志文件内容(返回行列表) Future> readLogFile(String fileName) async { + // 🟢 先尝试恢复 URI + await restoreUri(); + final state = await getPermissionState(); if (state != SafPermissionState.authorized) return []; + try { final String? content = await _channel.invokeMethod('readLogFile', { 'fileName': fileName, @@ -93,9 +131,14 @@ class SafStorageService { } } + /// 获取文件夹中的文件列表 Future> listFiles() async { + // 🟢 先尝试恢复 URI + await restoreUri(); + final state = await getPermissionState(); if (state != SafPermissionState.authorized) return []; + try { final result = await _channel.invokeMethod('listFiles'); if (result is List) { @@ -110,16 +153,19 @@ class SafStorageService { } } + /// 验证授权是否有效(简化版) Future validatePermission() async { final state = await getPermissionState(); return state == SafPermissionState.authorized; } + /// 清除缓存 void _clearCache() { _cachedUri = null; _saveUri(null); } + /// 保存 URI 到 SharedPreferences Future _saveUri(String? uri) async { try { final prefs = await SharedPreferences.getInstance(); @@ -141,5 +187,6 @@ class SafStorageService { } } + /// 获取缓存的 URI(用于调试) String? get cachedUri => _cachedUri; }