gal 1.8.2 gal: ^1.8.2 copied to clipboard
Gal is a Flutter plugin for saving image/video to gallary app. You can also easily handle permissions.
Gal🖼️ #
Easy to use Dart3 plugin for saving image/video to gallery app #
Please leave a like👍 and star⭐️ for more features.
Support | iOS 11.0+ | Android SDK 21+ |
---|---|---|
Example |
✨Features #
- Open gallery
- Save video (to album)
- Save image (to album)
- Handle permission
- Handle errors
- Lots of docs and wiki
🚀Get started #
Add dependency #
You can use the command to add gal as a dependency with the latest stable version:
$ flutter pub add gal
iOS #
Add the following key to your Info.plist file, located in
<project root>/ios/Runner/Info.plist
:
<key>NSPhotoLibraryAddUsageDescription</key>
<key>NSPhotoLibraryUsageDescription</key>
Requried If you want to save media to album.
you can copy from Info.plist in example.
Android (API <29) #
Add the following key to your AndroidManifest file, located in
<project root>/android/app/src/main/AndroidManifest.xml
:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
you can copy from AndroidManifest.xml in example.
🔴 Warning: Android emulators with API < 29 require SD card setup. Real devices don't.
✅Usage #
Save from local #
// 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')
...
Download from Internet #
$ 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);
Handle Permission #
// Check Permission
await Gal.hasAccess();
// Request Permission
await Gal.requestAccess();
🎯Example #
Here is a minimal example. A best practice and more detailed one can be found in example.
import 'package:flutter/material.dart';
import 'package:gal/gal.dart';
void main() => runApp(const App());
class App extends StatelessWidget {
const App({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Column(
children: [
TextButton(
onPressed: () async => Gal.open(),
child: const Text('Open Gallery'),
),
TextButton(
onPressed: () async => Gal.putVideo('VIDEO_PATH'),
child: const Text('Save Video'),
),
TextButton(
onPressed: () async => Gal.putImage('IMAGE_PATH'),
child: const Text('Save Image'),
),
TextButton(
onPressed: () async => Gal.hasAccess(),
child: const Text('Chack Permission'),
),
TextButton(
onPressed: () async => Gal.requestAccess(),
child: const Text('Request Permission'),
),
],
),
),
);
}
}
📪FAQ #
-
What is the best practice? #
Please see Best Practice in project wiki.
-
I have a question. #
Please see the Wiki first. If that didn't solve the problem. You should go to the Discussion. Once you are sure there are no duplicates, please ask them through Q&A.
💚Contributing #
Welcome! Feel free to create issue or PR. We kindly suggest considering to read this very short guide.