日期
2026-01-12
概述
实现 Android 系统分享接收功能,允许其他 App 分享文件到 StoreX,并进行代码清理优化。
分享接收功能
需求
- 其他 App 可以通过系统分享菜单将文件分享给 StoreX
- 分享后自动拉起文件夹选择器,可选择保存位置
- 选择后文件自动添加到上传队列
实现方案
1. Android 端 (MainActivity.kt)
- 在 AndroidManifest.xml 添加 intent-filter 接收 ACTION_SEND 和 ACTION_SEND_MULTIPLE
- 处理分享 Intent 时,将 URI 复制到应用私有缓存目录(解决 URI 权限问题)
- 通过 MethodChannel 传递文件路径给 Flutter 端
// 分享 Intent 处理流程
handleShareIntent(intent) {
1. 从 Intent 提取 URI 列表
2. 每个 URI 复制到 cacheDir/shared_files/
3. 通过 shareChannel 通知 Flutter
}2. Flutter 端
- ShareService: 单例服务,监听原生端分享事件
- 处理冷启动(getPendingFiles)和热启动(onShareReceived)两种场景
- home_page.dart: 收到分享后显示文件夹选择器,上传到选定目录
关键设计决策
- URI 复制到缓存: Android content:// URI 有权限限制,直接传路径不可靠,复制到私有目录确保 Flutter 可读取
- 冷启动支持: App 未运行时接收分享,需要在 Flutter 初始化后主动查询 pendingFiles
代码清理
删除废弃代码 (app_state.dart)
setOffline(): 已废弃,改用 refreshHealthStatus 统一管理loadCachedFiles(): 未被调用,离线加载已整合到 _loadFromLocalDb
合并重复代码 (home_page.dart)
_handleWidgetUpload和_handleTrayUpload完全相同- 提取为统一的
_pickAndUploadFiles()方法
删除死代码
save_note分支: NoteWidgetProvider 无对应 ACTION,属于遗留代码_handleSaveNote(): 无调用入口setShareCallback(): share_service.dart 中未使用的公开方法
文件变更
| 文件 | 变更类型 | 说明 |
|---|---|---|
| AndroidManifest.xml | 修改 | 添加分享 intent-filter |
| MainActivity.kt | 修改 | 添加 shareChannel 和分享处理逻辑 |
| share_service.dart | 新建 | 分享接收服务 |
| home_page.dart | 修改 | 初始化分享服务、处理分享回调、合并重复代码 |
| app_state.dart | 修改 | 删除废弃方法 |
验证
flutter analyze: No issues found