share_handler.dart
3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import 'dart:io';
import 'package:appframe/config/locator.dart';
import 'package:appframe/services/dispatcher.dart';
import 'package:appframe/utils/image_util.dart';
import 'package:dio/dio.dart';
import 'package:fluwx/fluwx.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';
class ShareHandler extends MessageHandler {
@override
Future<bool> handleMessage(params) async {
if (params is! Map<String, dynamic>) {
throw Exception('参数错误');
}
var weapp = params['weapp'];
if (weapp is! Map<String, dynamic>) {
throw Exception('参数错误');
}
var title = weapp['title'] as String? ?? '';
var imageUrl = weapp['imageUrl'] as String? ?? '';
var path = weapp['path'] as String? ?? '';
var appid = weapp['appid'] as String? ?? '';
var desc = weapp['desc'] as String? ?? '';
var envVersion = weapp['envVersion'] as String? ?? '';
if (title.isEmpty || imageUrl.isEmpty || path.isEmpty || appid.isEmpty) {
throw Exception('参数错误');
}
// 1 将图片下载到本机
var imagePath = await _downloadToTemporaryDirectory(imageUrl);
// 2 对图片生成缩略图
// 微信官方要求小程序卡片缩略图数据不能大于 128K,否则分享失败,因此要生成缩略图处理
var thumbPath = await ImageUtil.genTempThumbnail(imagePath, width: 640, quality: 14);
// 3 读取缩略图为Uint8List
var thumbData = await File(thumbPath!).readAsBytes();
try {
var model = WeChatShareMiniProgramModel(
webPageUrl: imageUrl,
miniProgramType: _getWXMiniProgramType(envVersion),
userName: appid,
path: path,
title: title,
description: desc,
thumbData: thumbData,
);
Fluwx fluwx = getIt.get<Fluwx>();
return await fluwx.share(model);
} catch (e) {
print(e);
return false;
}
}
WXMiniProgramType _getWXMiniProgramType(String? envVersion) {
switch (envVersion) {
case 'release':
return WXMiniProgramType.release;
case 'trial':
return WXMiniProgramType.preview;
case 'develop':
return WXMiniProgramType.test;
default:
return WXMiniProgramType.preview;
}
}
///
/// 将http资源下载到临时目录
/// 返回下载后的路径
///
Future<String> _downloadToTemporaryDirectory(String url) async {
// 要保存的文件名和扩展名
String saveFileName = path.basenameWithoutExtension(url);
String ext = path.extension(url);
// 临时目录
var dir = await getTemporaryDirectory();
// 要保存的路径
var targetPath = path.join(dir.path, '$saveFileName.$ext');
// 如果文件存在,则在文件名后添加数字
int i = 1;
while (File(targetPath).existsSync()) {
targetPath = path.join(dir.path, '$saveFileName($i).$ext');
i++;
}
final resp = await Dio().download(url, targetPath);
if (resp.statusCode != 200) {
throw Exception('文件下载失败');
}
return targetPath;
}
}