feat(programs): Android 端通过 MediaStore 写入公共 Downloads

Android 10+ 受 scoped storage 限制,getDownloadsDirectory() 返回的是
app-specific 目录 (/storage/emulated/0/Android/data/.../files/Download/),
而非用户可见的 /storage/emulated/0/Download/。

新增 MainActivity 端 MethodChannel com.xiarui.kuaishai2/downloads:
- API 29+:MediaStore.Downloads 写入公共 Downloads,无需权限
- API <=28:直接写 /storage/emulated/0/Download/(需 WRITE_EXTERNAL_STORAGE)

Dart 端 ExcelTemplateService 改用 MethodChannel,Android 平台返回
Download/<filename> 显示路径;其它平台保留 getDownloadsDirectory 行为。
返回值由 File 改为 String,调用方已同步更新。
This commit is contained in:
Developer
2026-06-04 15:45:23 +08:00
parent 16fbb7d54b
commit cbe1e6b470
3 changed files with 109 additions and 8 deletions

View File

@@ -454,9 +454,9 @@ class _ProgramsPageState extends ConsumerState<ProgramsPage> {
/// 下载 Excel 模板
Future<void> _downloadTemplate(BuildContext context) async {
try {
final file = await ExcelTemplateService.instance.generateTemplate();
final path = await ExcelTemplateService.instance.generateTemplate();
if (!context.mounted) return;
ToastService.showSuccess(context, '模板已保存: ${file.path}');
ToastService.showSuccess(context, '模板已保存: $path');
} catch (e) {
if (!context.mounted) return;
ToastService.showError(context, '生成模板失败: ${e.toString()}');