Please LIKE๐ and STARโญ๏ธ to support our volunteer efforts.
Support means that all functions have been tested manually or automatically whenever possible.
Android | iOS | macOS | Windows | Linux | |
---|---|---|---|---|---|
Support | SDK 21 | 11 | 11 | 10 | See: gal_linux |
iOS | Android | |
---|---|---|
Example | ![]() |
![]() |
- Open gallery
- Save video
- Save image
- Save to album
- Save with metadata
- Handle permission
- Handle errors
- Lots of docs and wiki
You can use the command to add gal as a dependency with the latest stable version:
$ flutter pub add gal
Add the following keys to the ios/Runner/Info.plist
:
<key>NSPhotoLibraryAddUsageDescription</key>
Required<key>NSPhotoLibraryUsageDescription</key>
Required for ios < 14 or saving to album
You can copy from Info.plist in example.
Add the following keys to the android/app/src/main/AndroidManifest.xml
:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
Required for API <= 29android:requestLegacyExternalStorage="true"
Required for saving to the album in API 29
You can copy from AndroidManifest.xml from example.
๐ด Warning: Android emulators with API < 29 require SD card setup. Real devices don't.
Add the following keys to the macos/Runner/Info.plist
:
<key>NSPhotoLibraryAddUsageDescription</key>
Required<key>NSPhotoLibraryUsageDescription</key>
Required for saving to album
You can copy from Info.plist in example.
๐ด Warning: Flutter currently has a fatal problem for loading info.plist, and permissions are always denied or app crashing in some code editors.
Update Visual Studio to the latest version for using C 20
.
๐ก If you can't compile
Try downloading a latest Windows SDK:
- Open Visual Studio Installer
- Select Modify
- Select Windows SDK
Currently does not officially support Linux, but it can be added through a non-endorsed federated plugin. See: gal_linux
// Save Image (Supports two ways)
await Gal.putImage('$filePath');
await Gal.putImageBytes('$uint8List');
// Save Video
await Gal.putVideo('$filePath');
// Save to album
await Gal.putImage('$filePath', album: '$album')
...
$ flutter pub add dio
// Download Image
final imagePath = '${Directory.systemTemp.path}/image.jpg';
await Dio().download('$url',imagePath);
await Gal.putImage(imagePath);
// Download Video
final videoPath = '${Directory.systemTemp.path}/video.mp4';
await Dio().download('$url',videoPath);
await Gal.putVideo(videoPath);
$ flutter pub add image_picker
// Shot and Save
final image = await ImagePicker.pickImage(source: ImageSource.camera);
await Gal.putImage(image.path);
$ flutter pub add camera
// Record and Save
...
final video = await controller.stopVideoRecording();
await Gal.putVideo(video.path);
// Check for access premission
final hasAccess = await Gal.hasAccess();
// Request access premission
await Gal.requestAccess();
// ... for saving to album
final hasAccess = await Gal.hasAccess(toAlbum: true);
await Gal.requestAccess(toAlbum: true);
// Save Image with try-catch
try {
await Gal.putImage('$filePath');
} on GalException catch (e) {
log(e.type.message);
}
// Exception Type
enum GalExceptionType {
accessDenied,
notEnoughSpace,
notSupportedFormat,
unexpected;
String get message => switch (this) {
accessDenied => 'Permission to access the gallery is denied.',
notEnoughSpace => 'Not enough space for storage.',
notSupportedFormat => 'Unsupported file formats.',
unexpected => 'An unexpected error has occurred.',
};
}
If you write an article about Gal, let us know in discussion and we will post the URL of the article in the wiki or readme ๐ค
Although Gal has only been released for a short time, it is already trusted by huge projects.
and more...