image_gallery_saver_plus
5.1.1A Flutter plugin for saving images to the gallery. iOS needs to add the following keys to your Info.plist file.
Readme
image_gallery_saver_plus
An updated plugin enables users to download and save images and videos directly to their gallery, with enhanced performance, improved media organization features, and better compatibility across various devices.
Usage
To use this plugin, add image_gallery_saver_plus as a dependency in your pubspec.yaml file. For example:
dependencies:
image_gallery_saver_plus: ^5.1.1
iOS
Your project need create with swift. Add the following keys to your Info.plist file, located in /ios/Runner/Info.plist:
<key>NSPhotoLibraryAddUsageDescription</key>
<string>We need permission to save photos and videos to your library for your convenience.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>We need permission to access your photo library to view and select your photos and videos.</string>
Android
You need to ask for storage permission to save an image to the gallery. You can handle the storage permission using flutter_permission_handler. In Android version 10, Open the manifest file and add this line to your application tag
<application android:requestLegacyExternalStorage="true" .....>
API
ImageGallerySaverPlus.saveImage(...)
Save raw image bytes to the gallery.
| Parameter | Type | Default | Description |
|---|---|---|---|
imageBytes |
Uint8List |
required | The image bytes to save. |
quality |
int |
80 |
JPEG compression quality (0–100). |
name |
String? |
null |
Optional file name. |
isReturnImagePathOfIOS |
bool |
false |
Return the saved file path on iOS. |
creationDate |
DateTime? |
null |
iOS only. Sets the asset's creation date shown in Photos. See below. |
ImageGallerySaverPlus.saveFile(...)
Save a PNG/JPG/JPEG image or a video file to the gallery.
| Parameter | Type | Default | Description |
|---|---|---|---|
file |
String |
required | Path to the local file to save. |
name |
String? |
null |
Optional file name. |
isReturnPathOfIOS |
bool |
false |
Return the saved file path on iOS. |
creationDate |
DateTime? |
null |
iOS only. Sets the asset's creation date shown in Photos (works for both images and videos). See below. |
Setting the creation date (iOS)
By default the gallery stamps saved media with the current date/time. Pass a
creationDate to control the date that Photos displays for the asset — useful
when re-saving media that was originally captured at an earlier time (e.g.
downloaded backups, imported memories).
final result = await ImageGallerySaverPlus.saveImage(
imageBytes,
quality: 80,
name: "my_photo",
creationDate: DateTime(2020, 1, 1),
);
final result = await ImageGallerySaverPlus.saveFile(
savePath,
creationDate: DateTime.parse("2020-01-01T10:30:00"),
);
Notes:
- iOS only. On iOS, providing a
creationDateimports the asset throughPHPhotoLibraryso the date is honored. When it isnull, the legacy save path is used and the asset gets the current date. - On Android the parameter is accepted but currently ignored; the asset keeps the date it is saved.
Example
Saving an image from the internet, quality and name is option
_saveLocalImage() async {
RenderRepaintBoundary boundary =
_globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
ui.Image image = await boundary.toImage();
ByteData? byteData =
await (image.toByteData(format: ui.ImageByteFormat.png));
if (byteData != null) {
final result =
await ImageGallerySaverPlus.saveImage(byteData.buffer.asUint8List());
print(result);
}
}
_saveNetworkImage() async {
var response = await Dio().get(
"https://ss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=a62e824376d98d1069d40a31113eb807/838ba61ea8d3fd1fc9c7b6853a4e251f94ca5f46.jpg",
options: Options(responseType: ResponseType.bytes));
final result = await ImageGallerySaverPlus.saveImage(
Uint8List.fromList(response.data),
quality: 60,
name: "hello");
print(result);
}
Saving file(ig: video/gif/others) from the internet
_saveNetworkGifFile() async {
var appDocDir = await getTemporaryDirectory();
String savePath = appDocDir.path + "/temp.gif";
String fileUrl =
"https://hyjdoc.oss-cn-beijing.aliyuncs.com/hyj-doc-flutter-demo-run.gif";
await Dio().download(fileUrl, savePath);
final result =
await ImageGallerySaverPlus.saveFile(savePath, isReturnPathOfIOS: true);
print(result);
}
_saveNetworkVideoFile() async {
var appDocDir = await getTemporaryDirectory();
String savePath = appDocDir.path + "/temp.mp4";
String fileUrl =
"https://s3.cn-north-1.amazonaws.com.cn/mtab.kezaihui.com/video/ForBiggerBlazes.mp4";
await Dio().download(fileUrl, savePath, onReceiveProgress: (count, total) {
print((count / total * 100).toStringAsFixed(0) + "%");
});
final result = await ImageGallerySaverPlus.saveFile(savePath);
print(result);
}
Changelog
Changelog
5.1.1
- Updated the README dependency example to use version
5.1.0.
5.1.0
- Added an optional
creationDateparameter tosaveImageandsaveFile. - Added iOS support for preserving custom creation dates for saved images and videos.
- Lowered the minimum supported versions to Dart 3.9.2 and Flutter 3.35.6.
5.0.0
- Added Swift Package Manager (SPM) support for iOS alongside CocoaPods.
- Raised minimum iOS support to 13.0.
- Raised Flutter SDK support to 3.38.0+ and Dart SDK support to >=3.10.0.
- Updated Android Gradle Plugin to 8.13.2 and Gradle wrapper to 8.14.5.
- Applied the Kotlin Android plugin to the Android plugin module and example app for current AGP compatibility.
- Updated Android media saving for scoped storage by using pending MediaStore entries on Android 10 and newer.
- Added legacy write-storage permission support for Android 9 and older.
- Removed obsolete Android manifest package declaration now that AGP uses the Gradle namespace.
- Cleaned up Android plugin Kotlin code by removing unused imports, clamping JPEG quality, and cleaning up failed media writes.
- Fixed the Android unit test to match the current plugin API.
- Removed legacy
fluttertoastdependency from the example app, replacing it withScaffoldMessengerSnackBar alerts. - Fixed local file URL crash in
saveImageAtFileUrlby usingURL(fileURLWithPath:). - Fixed JSON result serialization bug in
SaveResultModel.toDic().
4.0.1
- Fix: Avoid Double Read Issue and Use copyTo() for Efficient File Copying
4.0.0
- Support for the latest Gradle version.
- Compatibility with the latest Flutter version.
- Fixed issues related to deprecated Android APIs.
- Resolved compiling errors due to unused and old Kotlin code.
- Support for the latest Android Studio Ladybug with Flutter 3.29.*.
4.0.0-0.alpha
- Support for the latest Gradle version.
- Compatibility with the latest Flutter version.
- Fixed issues related to deprecated Android APIs.
- Resolved compiling errors due to unused and old Kotlin code.
- Support for the latest Android Studio Ladybug with Flutter 3.24.5.
3.0.5
- Stable Release: Marked as the stable release version.
- iOS Issue Resolved: Fixed issues affecting the iOS platform.
- Gradle Updated: Updated the Gradle configuration for better compatibility and performance.
3.0.4
- Readme doc updated.
3.0.3
- Fixed Ios Download Issue.
3.0.2
- Compatible with the latest Flutter version.
3.0.1
- Compatible with the latest Flutter version.
3.0.0
- Compatible with the latest Flutter version.
Installing
export PUB_HOSTED_URL=https://pub.mirror.p-hatan.com
flutter pub add image_gallery_saver_pluspubspec.yaml
name: image_gallery_saver_plus
description: A Flutter plugin for saving images to the gallery. iOS needs to add the following keys to your Info.plist file.
version: 5.1.1
# publish_to: 'https://pub.dev' # Publishes to pub.dev (default)
homepage: https://github.com/ArmanKT/image_gallery_saver_plus
repository: https://github.com/ArmanKT/image_gallery_saver_plus
environment:
sdk: ">=3.9.2 <4.0.0"
flutter: ">=3.35.6"
dependencies:
flutter:
sdk: flutter
flutter:
plugin:
platforms:
android:
package: com.example.image_gallery_saver_plus
pluginClass: ImageGallerySaverPlusPlugin
ios:
pluginClass: ImageGallerySaverPlusPlugin
dev_dependencies:
flutter_test:
sdk: flutter
# Optional but recommended:
# Add a changelog file and update it with version history.
# A 'CHANGELOG.md' file is necessary for publishing.
Version history
| Version | Published | Archive | SHA-256 |
|---|---|---|---|
| 3.0.0 | On demand | Download | e193eb4d…1fdb93 |
| 3.0.1 | On demand | Download | ad39bc7f…c3a48e |
| 3.0.2 | On demand | Download | 013f115f…e942b4 |
| 3.0.3 | On demand | Download | 2c1aea2d…5b7a8d |
| 3.0.4 | On demand | Download | 3985c8f2…032bf4 |
| 3.0.5 | On demand | Download | 05a5dfd6…d76153 |
| 4.0.0-0.alpha | On demand | Download | 388b2043…659312 |
| 4.0.0 | On demand | Download | d56cb274…5c3d3a |
| 4.0.1 | On demand | Download | 199b9e24…6950ad |
| 5.0.0 | On demand | Download | 83135406…00f745 |
| 5.1.0 | On demand | Download | 73183ff4…69861d |
| 5.1.1 | Cached · Upstream SHA-256 matched | Download | 598beaaa…8bd34a |
Dependencies
flutter {
"sdk": "flutter"
}