feat: save all pics

This commit is contained in:
bggRGjQaUbCoE
2024-10-13 09:37:59 +08:00
parent ae0d012c0f
commit 2f456da1c5
3 changed files with 69 additions and 33 deletions

View File

@@ -1,6 +1,7 @@
import 'dart:math';
import 'package:PiliPalaX/grpc/app/card/v1/card.pb.dart' as card;
import 'package:PiliPalaX/utils/extension.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../utils/download.dart';
@@ -80,11 +81,17 @@ class OverlayPop extends StatelessWidget {
onPressed: () async {
await DownloadUtils.downloadImg(
context,
videoItem is card.Card
? (videoItem as card.Card).smallCoverV5.base.cover
: (videoItem.pic != null
? videoItem.pic as String
: videoItem.cover as String),
[
videoItem is card.Card
? (videoItem as card.Card)
.smallCoverV5
.base
.cover
.http2https
: (videoItem.pic != null
? (videoItem.pic as String).http2https
: (videoItem.cover as String).http2https)
],
);
closeFn!();
},

View File

@@ -94,11 +94,25 @@ class _ImagePreviewState extends State<ImagePreview>
onTap: () {
Get.back();
DownloadUtils.downloadImg(
context, _previewController.currentImgUrl);
context,
[_previewController.currentImgUrl],
);
},
dense: true,
title: const Text('保存到手机', style: TextStyle(fontSize: 14)),
),
if (imgList!.length > 1)
ListTile(
onTap: () {
Get.back();
DownloadUtils.downloadImg(
context,
imgList!,
);
},
dense: true,
title: const Text('保存全部到手机', style: TextStyle(fontSize: 14)),
),
],
),
);

View File

@@ -1,5 +1,6 @@
import 'dart:typed_data';
import 'package:PiliPalaX/http/index.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
@@ -69,7 +70,8 @@ class DownloadUtils {
}
}
static Future<bool> checkPermissionDependOnSdkInt(BuildContext context) async {
static Future<bool> checkPermissionDependOnSdkInt(
BuildContext context) async {
if (Platform.isAndroid) {
final androidInfo = await DeviceInfoPlugin().androidInfo;
if (androidInfo.version.sdkInt <= 32) {
@@ -81,39 +83,52 @@ class DownloadUtils {
}
return await requestStoragePer(context);
}
static Future<bool> downloadImg(BuildContext context, String imgUrl,
{String imgType = 'cover'}) async {
static Future downloadImg(
BuildContext context,
List<String> imgList, {
String imgType = 'cover',
}) async {
try {
if (!await checkPermissionDependOnSdkInt(context)) {
// // return false;
return;
}
SmartDialog.showLoading(msg: '正在下载原图');
var response = await Dio()
.get(imgUrl, options: Options(responseType: ResponseType.bytes));
SmartDialog.dismiss();
SmartDialog.showLoading(msg: '正在保存图片至图库');
String picName =
"${imgType}_${DateTime.now().toString().replaceAll(' ', '_').replaceAll(':', '-').split('.').first}";
final SaveResult result = await SaverGallery.saveImage(
Uint8List.fromList(response.data),
quality: 100,
name: picName,
fileExtension: 'jpg',
// 保存到 PiliPalaX文件夹
androidRelativePath: "Pictures/PiliPalaX",
androidExistNotSave: false,
);
SmartDialog.dismiss();
if (result.isSuccess) {
await SmartDialog.showToast('$picName」已保存 ');
} else {
await SmartDialog.showToast('保存失败,${result.errorMessage}');
Dio dio = Dio()
..options = BaseOptions(
connectTimeout: const Duration(milliseconds: 10000),
receiveTimeout: const Duration(milliseconds: 10000),
);
for (int i = 0; i < imgList.length; i++) {
SmartDialog.showLoading(
msg:
'正在下载原图${imgList.length > 1 ? '${i + 1}/${imgList.length}' : ''}');
var response = await dio.get(imgList[i],
options: Options(responseType: ResponseType.bytes));
String picName =
"${imgType}_${DateTime.now().toString().replaceAll(' ', '_').replaceAll(':', '-').split('.').first}";
final SaveResult result = await SaverGallery.saveImage(
Uint8List.fromList(response.data),
quality: 100,
name: picName,
fileExtension: 'jpg',
// 保存到 PiliPalaX文件夹
androidRelativePath: "Pictures/PiliPalaX",
androidExistNotSave: false,
);
// SmartDialog.dismiss();
// SmartDialog.showLoading(msg: '正在保存图片至图库');
if (i == imgList.length - 1) {
SmartDialog.dismiss();
}
if (result.isSuccess) {
await SmartDialog.showToast('$picName」已保存 ');
} else {
await SmartDialog.showToast('保存失败,${result.errorMessage}');
}
}
return true;
} catch (err) {
SmartDialog.dismiss();
SmartDialog.showToast(err.toString());
return true;
}
}
}