La capacidad de usar la c谩mara existe en muchas aplicaciones, y todos la usamos regularmente. En Flutter, podemos implementar el trabajo con la c谩mara utilizando dos complementos oficiales:
Hay una diferencia notable entre ellos, y vale la pena usarlos de acuerdo con la situaci贸n:
camera
permite interactuar con las c谩maras disponibles para el dispositivo desde su aplicaci贸n y mostrar la imagen en el widget. Es adecuado para tareas en las que necesita "personalizar" el funcionamiento de la c谩mara para la aplicaci贸n.image-picker
inicia la aplicaci贸n de la c谩mara y devuelve un objeto de tipo File
( File
imagen o video seleccionado por el usuario) a su aplicaci贸n. Adem谩s, image-picker
permite seleccionar un archivo de los disponibles en el dispositivo, mientras que, como en el caso de la c谩mara, se inicia una aplicaci贸n separada, despu茅s de lo cual el objeto seleccionado se devuelve a su aplicaci贸n.
Aqu铆 puedes ver la fuente .
camara
1. Agregue el complemento a nuestro proyecto de acuerdo con las instrucciones
Configuraciones adicionales para OS
iOS
Agregue las siguientes l铆neas a ios/Runner/Info.plist
:
<key>NSCameraUsageDescription</key> <string>Access to Camera</string> <key>NSMicrophoneUsageDescription</key> <string>Access to Microphone</string>
Android
Aseg煤rese de que la versi贸n m铆nima de Android SDK en el archivo android/app/build.gradle
21 .
minSdkVersion 21
Se solicitar谩n todos los permisos necesarios cuando se inicie la aplicaci贸n.

Trabaja en emuladores
En el caso de iOS, no podemos verificar la c谩mara en el emulador, necesitamos un dispositivo "en vivo".
Android genera un simulacro (ver imagen a continuaci贸n), que reemplaza lo que ve la lente de la c谩mara.
Si no quieres mirar el enchufe est谩ndarEn la configuraci贸n del emulador, seleccione Configuraci贸n avanzada y configure VirtualScene
para la c谩mara trasera.

Reiniciamos el emulador. Ahora la c谩mara "muestra" la sala virtual, que se puede mover con el mouse y wasd.

Gracias a Tonn_Tamerlan por el dato .
2. Pasamos al c贸digo. Primero obtenemos todas las c谩maras disponibles usando la funci贸n C谩maras availableCameras
.
final cameras = await availableCameras();
Esta funci贸n devolver谩 una serie de descripciones ( List<CameraDescription>
) de c谩maras disponibles, donde cada elemento contendr谩 el nombre de la c谩mara (puede ser solo un 铆ndice), tipo (posterior, frontal, externo) y el 谩ngulo con el que desea rotar la foto para que aparezca en su orientaci贸n
Para controlar la c谩mara, necesitamos un controlador de objetos como CameraController
, para determinar cu谩l necesita especificar una de las descripciones y la resoluci贸n de la c谩mara recibida (baja, media, alta).
void _setCameraController(CameraDescription cameraDescription) async { _controller = CameraController(cameraDescription, ResolutionPreset.medium); ... await _controller.initialize(); ... if (mounted) { setState(() {}); } }
A continuaci贸n, inicializamos el controlador y despu茅s de asegurarnos de que el widget est谩 "vivo", actualizamos el estado de este widget. ( texto de funci贸n )
Pasamos el controlador inicializado al widget CameraPreview
AspectRatio( aspectRatio: _controller.value.aspectRatio, child: CameraPreview(_controller))
CameraPreview
se basa en el widget Texture
, que se encarga de mostrar una imagen de la c谩mara. Sus dimensiones est谩n determinadas por el padre, por lo que el widget AspectRatio
, que determina el tama帽o del ni帽o en una determinada relaci贸n de aspecto, es un buen enfoque. Obtenemos la proporci贸n del controlador _controller.value.aspectRatio
. Como resultado, en la interfaz obtenemos una imagen en la interfaz
Vista de la aplicaci贸n despu茅s de la inicializaci贸n del controlador 3. Ahora podemos tomar una foto o grabar un video.
a. Tomamos una foto ( texto de funci贸n ) utilizando el takePicture(String path)
. Toma una foto y la guarda a lo largo de la ruta especificada.
Future<void> _takePhoto(BuildContext context) async { ... await _controller.takePicture(filePath); ... }
Para obtener la ruta, necesitamos el complemento oficial path_provider y su m茅todo getApplicationDocumentsDirectory
, que devolver谩 un directorio privado. A continuaci贸n, determinamos el nombre del directorio a probar, si es necesario, lo creamos y seleccionamos el nombre del archivo:
final Directory extDir = await getApplicationDocumentsDirectory(); final String dirPath = '${extDir.path}/Pictures/flutter_camera'; await Directory(dirPath).create(recursive: true); final String filePath = '$dirPath/${_getTimestamp()}.jpg';
Antes de tomar una foto, es recomendable verificar que el controlador se haya inicializado y que la foto ya no se tome.
if (!_controller.value.isInitialized) { return null; } ... if (_controller.value.isTakingPicture) { return null; }
La foto fue tomada, tenemos un camino, ser铆a agradable verla. Usando el widget de Image
est谩ndar, el objeto File
y la ruta del archivo, mostramos la imagen en la pantalla.
Image.file(File(filePath))
Conclusi贸n de la foto recibida b. Al grabar video ( texto de funci贸n ), necesitamos dos funciones: startVideoRecording(String filePath)
y stopVideoRecording()
.
Future<void> _startVideoRecording() async { ... await _controller.startVideoRecording(filePath); ... } Future<void> _stopVideoRecording(BuildContext context) async { ... await _controller.stopVideoRecording(); ... }
startVideoRecording
escribe un video y lo guarda de acuerdo con la ruta especificada (obtenida por el mismo principio que con una fotograf铆a), stopVideoRecording
simplemente finaliza el proceso de grabaci贸n. Antes de comenzar a grabar, aseg煤rese de que el disparo ya no est茅 en progreso.
if (_controller.value.isRecordingVideo) { return null; }
Como resultado, tenemos un video guardado y una ruta hacia 茅l. Para jugarlo, necesitar谩s el complemento video_player . Todo el c贸digo asociado con la reproducci贸n del video, sacado en un archivo separado.
Graba y juega en la interfaz
selector de imagen
1. Agregue el complemento a nuestro proyecto de acuerdo con las instrucciones
Configuraciones adicionales para OS
iOS
Agregue las siguientes l铆neas a ios/Runner/Info.plist
:
<key>NSCameraUsageDescription</key> <string>Access to Camera</string> <key>NSMicrophoneUsageDescription</key> <string>Access to Microphone</string> <key>NSPhotoLibraryUsageDescription</key> <string>Access to PhotoLibrary</string>
Trabaja en emuladores
En iOS, no podemos comprobar la c谩mara en el emulador, necesitamos un dispositivo "en vivo".

2. image-picker
utiliza una aplicaci贸n est谩ndar para crear fotos / videos o ver archivos. Para iniciar la aplicaci贸n deseada, debe usar la funci贸n pickImage
para la foto o pickVideo
y especificar el par谩metro de origen.
... final File video = await ImagePicker.pickVideo(source: ImageSource.camera); final File photo = await ImagePicker.pickImage(source: ImageSource.gallery);
Nuestra aplicaci贸n recibe el archivo seleccionado, pero si no se seleccion贸 nada, se devolver谩 null
. Para mostrar im谩genes y videos, utilizamos los mismos enfoques que en el caso del complemento de la camera
. Para las im谩genes, el widget Imagen: esta vez no es necesario que lo envuelva en File
, ya que inicialmente recibimos un objeto de este tipo.
Image.file(photo)
Para el complemento de video video_player . Todo el c贸digo asociado con la reproducci贸n del video, sacado en un archivo separado.
Conclusi贸n
Como puede ver, image-picker
notablemente m谩s f谩cil de usar y funciona muy bien cuando solo necesita transferir una imagen o video a una aplicaci贸n. camera
tambi茅n nos proporciona todas las funciones necesarias para personalizar el trabajo del usuario con la c谩mara en su aplicaci贸n.
Gracias por leer!