取得权限的前置作业
iOS
Info.plist内新增
NSPhotoLibraryUsageDescription的权限
Android
AndroidManifest.xml 内新增
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在getImage()里面 呼叫GallerySaver.saveImage(), 并给图片路径.
getImage(ImageSource source) async {
final _picker = ImagePicker();
XFile? pickedFile = await _picker.pickImage(source: source);
if (pickedFile != null) {
imageFilePath = await cropImage(pickedFile.path);
GallerySaver.saveImage(imageFilePath);
}
}
如果图片来源自网址
saveFromUrl(String urlPath) async {
GallerySaver.saveImage(urlPath).then((bool success) {
//success callback
});
}
来源自网址的影片也可以下载到手机相簿里
之前处理这段遇到了一个问题是
GallerySaver虽然可以自动判断是本地路径或是url
但如果来源的网址很长或被判断是不可下载的网址
作法改成:
Future<bool> saveVideoToAlbum(String urlPath) async {
//先创一个暂时路径, getTemporaryDirectory() 需导入path_provider
Directory appDocDir = await getTemporaryDirectory();
final String timeStamp = DateTime.now().millisecondsSinceEpoch.toString();
//档名暂时用timeStamp命名
String temporaryPath = appDocDir.path + "$timeStamp.mp4";
//把档案用Dio download存到暂时路径
final response = await Dio().download(urlPath, temporaryPath,
onReceiveProgress: (count, total) {
//这边是下载进度的换算, 可以从这里取出数值
print((count / total * 100).toStringAsFixed(0) + "%");
});
//再用GallerySaver存到相簿
bool? isSucceed = await GallerySaver.saveVideo(temporaryPath);
if (isSucceed != null) {
if (isSucceed) {
//最後再将暂存的档案删除
deleteTemporaryFile(temporaryPath);
return true;
}
}
return false;
}
deleteTemporaryFile(String filePath) async {
try {
await File(filePath).delete();
} catch (error) {
print('Delete TemporaryFile error');
print(error);
}
}
下一篇将为大家介绍 flutter_slidable
ListView(iOS的 tableView)左右滑动的操作
>>: Day 9 学习线上服务思考用户的数位防身术-国外篇
上一篇我们的基因体时代-AI, Data和生物资讯 Day20-注释基因资讯的BED档案格式和bed...
VARCHAR & CHAR VARCHAR(0-65535)/CHAR(0-255)差别於...
原本不打算参加今年的活动,但还是在开始报名後点了,画面停在题目栏许久,想想要带给大家甚麽不同的东西,...
在本地化 (localize) 文字讯息时,我们可能会遇到需要特别处理 HTML tag的情况,什...
还记得之前我装了个相机吗? 当初很害怕地把它组装上去,就怕插错或是折到排线,以至於他不能正常动作 那...