Flutter Image / Video Picker — Flutter — Karthik Ponnam — Medium
Привет всем разработчикам флаттера
Все вы знаете, что у флаттера 1.9 есть релиз и он поддерживает много новых виджетов. Чтобы узнать больше, что добавил примечания к выпуску здесь
Сегодня мы увидим, как использовать image_picker
плагин для получения файла изображения и видео из галереи и камеры
Вот как будет течь
- Добавлять
image_picker
подключаемый модульpubspec.yaml
- Добавьте необходимые разрешения, если они есть
- Вызов
ImagePicker.pick*
и это вернет вам файл - Отобразите файл или выполните необходимое действие.
Итак, давайте начнем
Добавление зависимостей
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
image_picker: ^0.6.1+4
Добавление разрешений
Как указано в плагинах, вам не нужно никаких разрешений для Android, но для iOS нам нужно указать некоторые разрешения.
Добавьте следующие ключи в файл Info.plist, расположенный в
NSPhotoLibraryUsageDescription — опишите, почему вашему приложению требуется разрешение для библиотеки фотографий. В визуальном редакторе это называется Privacy — Photo Library Usage Description.
NSCameraUsageDescription — опишите, почему вашему приложению нужен доступ к камере. В визуальном редакторе это называется Конфиденциальность — Описание использования камеры.
NSMicrophoneUsageDescription — опишите, зачем вашему приложению нужен доступ к микрофону, если вы собираетесь записывать видео. В визуальном редакторе это называется Конфиденциальность — Описание использования микрофона.
<key>NSCameraUsageDescription</key>
<string>Used to demonstrate image picker plugin</string>
<key>NSMicrophoneUsageDescription</key>
<string>Used to capture audio for image picker plugin</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Used to demonstrate image picker plugin</string>
Мы закончили с разрешения.
Плагин вызова
Чтобы выбрать изображение из галереи
Мы используем метод, предоставляемый плагином, т.е. ImagePicker.pickImage
который принимает несколько параметров
source
: Это может быть ImageSource.gallery
или же ImageSource.camera
imageQuality
: это указывает, в каком качестве вы хотите, чтобы файл был, это свойство принимает double
из 0 to 100
Например, если ваш файл слишком большой, мы можем получить ошибку при отображении изображения, поэтому лучше использовать imageQuality
maxWidth
: какой максимальной ширины должно быть изображение?maxHeight
: какой максимальной высоты должно быть изображение?
Если указано, изображение будет не более maxWidth
широкий и maxHeight
высокий. В противном случае изображение будет возвращено с исходной шириной и высотой.
File _image;
_pickImageFromGallery() async {
File image = await ImagePicker.pickImage(source: ImageSource.gallery, imageQuality: 50);
setState(() {
_image = image;
});
}
Чтобы выбрать изображение с камеры
File _cameraImage;
_pickImageFromCamera() async {
File image = await ImagePicker.pickImage(source: ImageSource.camera, imageQuality: 50);
setState(() {
_cameraImage = image;
});
}
Здесь у нас есть функции, в которых мы можем вызвать функцию и получить изображение, где его вызывать и как отображать изображение.
Conatiner(
child: Column(
children: <Widget>[
if(_image != null)
Image.file(_image)
else
Text("Click on Pick Image to select an Image", style: TextStyle(fontSize: 18.0),),
RaisedButton(
onPressed: () {
_pickImageFromGallery();
},
child: Text("Pick Image From Gallery"),
),
]
)
)
Теперь у нас есть, как выбрать изображение из галереи и камеры с помощью одной строки кода.
Давайте посмотрим, как выбрать видео из галереи и камеры.
Единственное изменение, которое мы можем увидеть при выборе изображения и видео, это pickVideo
вместо pickImage
ImagePicker.pickVideo
принимает только одно свойство, т.е. source
чем может ImageSource.gallery
или же ImageSource.camera
Чтобы отображать и воспроизводить видео, нам нужно зависеть от третьей стороны, потому что Flutter по умолчанию не поддерживает воспроизведение видео.
Итак, для отображения видео мы используем video_player
плагин
Добавьте эту зависимость в pubspec.yaml
video_player: ^0.10.2+1
Теперь приведенная ниже функция вызовет плагин для выбора видеофайла и вернет нам файл или ноль.
Если source
указывается как ImageSource.gallery
Вам предлагается выбрать из галереи
File _video;
_pickVideo() async {
File video = await ImagePicker.pickVideo(source: ImageSource.gallery);
_video = video;
_videoPlayerController = VideoPlayerController.file(_video)..initialize().then((_) {
setState(() { });
_videoPlayerController.play();
});
}
Если source
указывается как ImageSource.camera
Вам предлагается выбрать из камеры
File _cameraVideo;
_pickVideoFromCamera() async {
File video = await ImagePicker.pickVideo(source: ImageSource.camera);
_cameraVideo = video;
_cameraVideoPlayerController = VideoPlayerController.file(_cameraVideo)..initialize().then((_) {
setState(() { });
_cameraVideoPlayerController.play();
});
}
Для воспроизведения видео мы используем video_player
плагин, который нужен этому плагину VideoPlayerController
.
_cameraVideoPlayerController = VideoPlayerController.file(_cameraVideo)..initialize().then((_) {
setState(() { });
_cameraVideoPlayerController.play();
});
Выше код, который мы уже написали в _pickVideo()
а также _pickVideoFromCamera()
функции
Этот фрагмент кода сначала устанавливает, что мы проигрываем видео из файла, а затем вызываем initialize
однажды initialize
сделано, то мы можем setState(() {})
а затем мы начинаем воспроизводить видео с помощью _controller.play()
У нас также естьVideoPlayerController.file
воспроизвести видео из файлаVideoPlayerController.asset
для воспроизведения видео из активовVideoPlayerController.network
воспроизводить видео из сети
Container(
child: Column(
children: <Widget>[
if(_video != null)
_videoPlayerController.value.initialized
? AspectRatio(
aspectRatio: _videoPlayerController.value.aspectRatio,
child: VideoPlayer(_videoPlayerController),
)
: Container()
else
Text("Click on Pick Video to select video", style: TextStyle(fontSize: 18.0),),
RaisedButton(
onPressed: () {
_pickVideo();
},
child: Text("Pick Video From Gallery"),
),
],
),
),
AspectRatio(
aspectRatio: _videoPlayerController.value.aspectRatio,
child: VideoPlayer(_videoPlayerController),
)
Над фрагментом кода мы будем использовать AspectRatio
изменить размер виджета в соответствии с размером видео.
Мы называем _pickImage
, _pickVideo
методы всякий раз, когда мы нажимаем кнопку
Вот как мы выбираем изображение или видео из галереи или камеры.
Вы можете получить Исходный код здесь
Спасибо за ваше время.
Надеюсь вам понравится, если да хлопать и делиться.