Si queremos añadir el módulo nativo para obtener imágenes desde la galería, lo mejor que podemos hacer es utilizar expo-image-picker
Lo primero que vamos a hacer es instalar la librería:
expo install expo-image-picker
Una vez instalada, tenemos que ir a app.json y añadir:
{ "expo": { "plugins": [ [ "expo-image-picker", { "photosPermission": "The app accesses your photos to let you share them with your friends." } ] ] } }
Para configurar el plugin.
Si tenemos parte nativa en iOS, tenemos que ir a Info.plist y añadir el permiso:
<key>NSPhotoLibraryUsageDescription</key> <string>Allow $(PRODUCT_NAME) to access your photo library.</string>
Ahora ya tenemos todo preparado para implementar la librería.
Creamos un componente nuevo llamado ImagesPicker.
Importamos la librería.
import * as ImagePicker from 'expo-image-picker';
Podemos crear una función para obtener las imágenes de la librería.
export async function getImageLibrary(funcionRetorno) { let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: true, base64: true, aspect: [9, 16], quality: 0.8, }); if (!result.cancelled) { objetoImagenRetornar = { data: result, fileData: result.base64, base64Data: 'data:image/jpeg;base64,' + result.base64, fileUri: result.uri }; funcionRetorno(objetoImagenRetornar); } else { funcionRetorno(-2); } }
En este caso, creo una función que usaré para retornar la imagen en base64 que he obtenido de la galería.
Con las opciones mediaTypes: ImagePicker.MediaTypeOptions.Images, indico que solo me deje seleccionar Imágenes, con allowsEditing, me deja editar tamaño en la galería del movil, base64 a true para activar que devuelva base64. Establezco la relación aspecto a 9:16 o el que necesitemos, y la calidad de 1-0.
Finalmente, obtengo el objeto devuelto con este aspecto:
{ "assetId": "C166F9F5-B5FE-4501-9531", "base64": null, "duration": null, "exif": null, "fileName": "IMG.HEIC", "fileSize": 6018901, "height": 3025, "type": "image", "uri": "file:///data/user/0/host.exp.exponent/cache/cropped1814158652.jpg" "width": 3024 }
Este sería el código completo:
import * as ImagePicker from 'expo-image-picker'; export async function getImageLibrary(funcionRetorno) { let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: true, base64: true, aspect: [9, 16], quality: 0.8, }); if (!result.cancelled) { objetoImagenRetornar = { data: result, fileData: result.base64, base64Data: 'data:image/jpeg;base64,' + result.base64, fileUri: result.uri }; funcionRetorno(objetoImagenRetornar); } else { funcionRetorno(-2); } }
Ingeniero en Informática, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.