Expo SDK en práctica

Expo Location y CameraView: permisos antes de usar APIs nativas

Para usar geolocalización y cámara en React Native con Expo, instalá los paquetes con npx expo install, pedí permisos en pantalla y recién después llamá a Location o renderizá CameraView. Ese orden evita pantallas vacías, errores de permisos y APIs nativas ejecutadas demasiado pronto.

npx expo install expo-location expo-camera
requestForegroundPermissionsAsync()
getCurrentPositionAsync({})
useCameraPermissions()
permission.granted && <CameraView />

Flujo mínimo correcto

Instalar

npx expo install expo-location expo-camera

Mantiene versiones compatibles con el SDK del proyecto.

Ubicación

Location.requestForegroundPermissionsAsync()

Pedí permiso antes de leer latitude y longitude.

Coordenadas

Location.getCurrentPositionAsync({})

Usalo para una lectura puntual de foreground location.

Cámara

useCameraPermissions() + CameraView

Renderizá la vista solo si permission.granted es true.

Expo Go o development build

  • - Expo Go alcanza para practicar ubicación foreground y cámara cuando el paquete está incluido en el Expo SDK.
  • - Development build conviene si necesitás background location, servicios en Android, config nativa o librerías fuera de Expo Go.
  • - Si el permiso es denied, no intentes renderizar CameraView ni leer ubicación: mostrale al usuario una acción clara.
  • - Si el emulador no devuelve coordenadas, revisá permisos, ubicación del dispositivo y que no estés pidiendo background location.

Convertí permisos nativos en una mini app mostrable.

Una pantalla con coordenadas reales, estado de permisos y cámara controlada se entiende mejor que una lista de paquetes.

Crear app clima

Expo Location en React Native: permisos y CameraView

Lectura
24 min~7 min lectura
Respuesta rápida: Expo Location: Para usar ubicación en React Native con Expo, instalá expo-location con npx expo install expo-location, pedí permisos foreground con Location.requestForegroundPermissionsAsync() y después leé coordenadas con Location.getCurrentPositionAsync(). Expo Go sirve para pruebas básicas; usá un development build cuando necesitás configuración nativa o comportamiento parecido a producción.

Expo Location en React Native

Expo Location es el módulo expo-location del Expo SDK para obtener la ubicación del dispositivo en apps React Native. Lo vas a usar en productos con mapas, entregas, comercios cercanos, clima, check-ins, direcciones o formularios que necesitan latitud y longitud.

El flujo profesional es corto pero estricto: instalar la versión compatible, pedir permiso en una acción visible, manejar permiso denegado, obtener coordenadas y probar en un dispositivo o emulador con ubicación configurada. Si la app falla, casi siempre el problema está en permisos, GPS desactivado, simulador sin ubicación o una configuración avanzada que requiere development build.

Qué es Expo SDK en React Native

El Expo SDK reúne APIs para cámara, ubicación, notificaciones, sensores, archivos, pantalla, autenticación y otros módulos nativos usados en apps móviles. En vez de pelear con configuración nativa desde el primer día, podés instalar el módulo correcto, importarlo y probarlo dentro de una app Expo.

Para aprender y crear portfolio, lo más importante es entender el patrón común del Expo SDK: instalar con una versión compatible, pedir permisos en el momento correcto, probar en dispositivo real y saber cuándo Expo Go alcanza o cuándo necesitás un development build.

Qué problema resuelve expo-location

expo-location es el módulo del Expo SDK para obtener ubicación del dispositivo, leer latitud y longitud, verificar permisos, acceder a la última ubicación conocida y, cuando el producto lo justifica, trabajar con ubicación en segundo plano. Para la mayoría de apps iniciales alcanza con foreground location: el usuario toca una acción visible y la app obtiene la ubicación actual.

La parte importante no es memorizar una API aislada, sino respetar el orden: instalar el paquete compatible con tu Expo SDK, solicitar permiso, manejar el caso denegado y recién después leer coordenadas. Si saltás un paso, el error suele parecer de Expo, pero en realidad es de permisos o del simulador sin ubicación configurada.

Expo SDK: módulos más usados para apps reales

Módulo Expo SDKPaqueteUso profesional
Locationexpo-locationMapas, entregas, check-in, comercios cercanos, clima.
Cameraexpo-cameraFotos, escaneo, evidencia, contenido generado por usuarios.
Notificationsexpo-notificationsRecordatorios, alertas de producto, estados de pedidos.
Image Pickerexpo-image-pickerSubir avatar, portfolio, comprobantes o imágenes de producto.
Secure Storeexpo-secure-storeGuardar tokens o datos sensibles con más cuidado que AsyncStorage.

Si buscás "expo sdk", no memorices todos los módulos. Elegí una app concreta, por ejemplo clima con ubicación, diario con foto o perfil con avatar, y aprendé los permisos nativos que necesita.

Instalar expo-location

Dentro de tu proyecto Expo, instalá el paquete con el instalador de Expo para recibir una versión compatible con tu SDK:

npx expo install expo-location

Luego importá el módulo en el componente o hook donde vas a usarlo:

import * as Location from "expo-location";

Pedir permisos de ubicación

En iOS y Android no podés leer ubicación sin autorización del usuario. Para una app que muestra mapas, comercios cercanos, check-in, entregas, clima o contenido local, empezá por permisos foreground:

const { status } = await Location.requestForegroundPermissionsAsync();

if (status !== "granted") {
  throw new Error("Permiso de ubicación denegado");
}

Mostrá un mensaje claro si el permiso fue rechazado. No escondas el error: explicá por qué la app necesita ubicación y dejá una alternativa manual cuando tenga sentido.

Obtener coordenadas actuales

Con permiso concedido, llamá a getCurrentPositionAsync. Para una primera versión, Location.Accuracy.Balanced suele ser suficiente porque evita gastar batería de más y responde bien para muchos casos de uso.

const current = await Location.getCurrentPositionAsync({
  accuracy: Location.Accuracy.Balanced,
});

console.log(current.coords.latitude, current.coords.longitude);

Escuchar cambios con watchPositionAsync

Si la app necesita seguir la ubicación mientras el usuario se mueve, usá Location.watchPositionAsync en lugar de llamar muchas veces a getCurrentPositionAsync. Guardá la suscripción y limpiala al desmontar la pantalla para no gastar batería ni dejar listeners activos.

const subscription = await Location.watchPositionAsync(
  {
    accuracy: Location.Accuracy.Balanced,
    distanceInterval: 25,
  },
  (location) => {
    console.log(location.coords.latitude, location.coords.longitude);
  }
);

subscription.remove();

Usá seguimiento continuo solo cuando el caso lo justifique: mapas, entregas, tracking de actividad o check-ins. Para una app de clima, comercios cercanos o formulario con dirección, una lectura puntual suele alcanzar.

Ejemplo completo con React Native y Expo

Este componente cubre instalación, permiso, loading, error y coordenadas listas para usar en una pantalla real:

import { useState } from "react";
import { Button, Text, View } from "react-native";
import * as Location from "expo-location";

export default function LocationExample() {
  const [coords, setCoords] = useState<Location.LocationObjectCoords | null>(null);
  const [error, setError] = useState<string | null>(null);
  const [loading, setLoading] = useState(false);

  async function loadLocation() {
    setLoading(true);
    setError(null);

    try {
      const { status } = await Location.requestForegroundPermissionsAsync();

      if (status !== "granted") {
        setError("Necesitamos permiso de ubicación para mostrar tu posición.");
        return;
      }

      const current = await Location.getCurrentPositionAsync({
        accuracy: Location.Accuracy.Balanced,
      });

      setCoords(current.coords);
    } catch {
      setError("No se pudo obtener la ubicación. Verificá permisos y GPS.");
    } finally {
      setLoading(false);
    }
  }

  return (
    <View style={{ gap: 12, padding: 24 }}>
      <Button title="Obtener ubicación" onPress={loadLocation} />

      {loading && <Text>Buscando ubicación...</Text>}
      {error && <Text>{error}</Text>}
      {coords && (
        <Text>
          Latitud: {coords.latitude} | Longitud: {coords.longitude}
        </Text>
      )}
    </View>
  );
}

Probar Expo Location en emulador o dispositivo

Si probás en un celular real, verificá que el GPS esté activado y que la app tenga permisos. Si probás en Android Emulator o iOS Simulator, configurá una ubicación simulada desde las herramientas del emulador; si no lo hacés, la app puede quedar esperando o devolver una posición poco útil.

  • Expo Go: sirve para validar el flujo básico de foreground location.
  • Development build: conviene si vas a combinar ubicación con módulos nativos o configuración avanzada.
  • Producción: probá en iOS y Android porque los permisos y mensajes del sistema no se comportan exactamente igual.

Errores comunes con expo-location

ProblemaCausa probableSolución
No devuelve coordenadasPermiso denegado o ubicación del dispositivo apagadaPedí permiso foreground y verificá GPS/emulador.
Funciona en Android pero no en iOSDiferencias de permisos o configuración de appProbá ambos sistemas y revisá mensajes de autorización.
Tarda demasiadoPrecisión alta sin necesidadUsá Location.Accuracy.Balanced o probá última ubicación conocida.
La app consume mucha bateríaSeguimiento continuo sin necesidadUsá watchPositionAsync solo con intervalos y limpieza de suscripción.
Querés tracking en segundo planoBackground location requiere configuración extraNo lo agregues hasta justificar producto, permisos y batería.

Cuándo usar ubicación, cámara y notificaciones juntas

Esta lección pertenece al bloque de Expo SDK porque muchas apps reales combinan varios módulos nativos. Una app de entregas puede guardar ubicación; una app de inspecciones puede tomar foto; una app de reservas puede enviar recordatorios. La clave es no pedir todos los permisos al abrir la app: pedilos cuando el usuario entiende el beneficio.

MóduloPaqueteUso típico
Ubicaciónexpo-locationMapas, check-in, comercios cercanos, entregas.
Cámaraexpo-cameraEscanear, capturar evidencia, crear contenido visual.
Notificacionesexpo-notificationsRecordatorios, alertas transaccionales, seguimiento.

Ejercicio: app de diario con foto y ubicación

Construí una pantalla que permita guardar una entrada con texto, foto y coordenadas. Primero implementá ubicación con expo-location. Después sumá cámara o selector de imagen. Por último, mostrale al usuario una confirmación al guardar.

  1. Creá el proyecto con npx create-expo-app DiarioApp.
  2. Instalá expo-location y validá que podés mostrar latitud/longitud.
  3. Agregá un campo de texto para la nota.
  4. Guardá cada entrada en estado local con fecha, nota y coordenadas.
  5. Probalo en dispositivo real y en emulador con ubicación simulada.

Checklist antes de publicar

  • Instalé expo-location con npx expo install.
  • Pido requestForegroundPermissionsAsync antes de leer coordenadas.
  • Manejo permiso denegado con un mensaje claro.
  • Uso precisión razonable para no gastar batería innecesariamente.
  • Limpio la suscripción si uso watchPositionAsync.
  • Probé la ubicación en iOS y Android, no solo en un navegador.
  • Si necesito background location, lo trato como una función avanzada con configuración propia.

Siguiente paso laboral

La habilidad que buscan muchos proyectos no es solamente "usar Expo", sino conectar permisos, estado de UI, manejo de errores y pruebas reales. Cuando termines esta práctica, subila a tu portfolio y conectala con rutas de empleos tech, cursos de React Native y perfiles de profesionales Cursalo.

Referencias oficiales: Expo Location, Expo Camera y development builds de Expo.

Respuesta directa

¿Cómo usar Expo Location y CameraView con Expo SDK en React Native?

Para usar Expo Location y CameraView con Expo SDK en React Native, instalá expo-location y expo-camera con npx expo install, pedí permisos antes de usar APIs nativas, llamá requestForegroundPermissionsAsync para ubicación y renderizá CameraView solo cuando useCameraPermissions confirme permission.granted. Expo Go sirve para lecturas foreground básicas; usá development build si necesitás background location, foreground services, configuración nativa o comportamiento parecido a producción.

npx expo install expo-location expo-camera

import { useEffect, useState } from 'react';
import { Button, Text, View } from 'react-native';
import * as Location from 'expo-location';

import { CameraView, useCameraPermissions } from 'expo-camera';

export default function ExpoSdkScreen() {
  const [permission, requestPermission] = useCameraPermissions();
  const [coords, setCoords] = useState(null);
  const [error, setError] = useState('');

  useEffect(() => {
    async function loadLocation() {
      const { status } = await Location.requestForegroundPermissionsAsync();
      if (status !== 'granted') {
        setError('Permiso de ubicación denegado');
        return;
      }
      const current = await Location.getCurrentPositionAsync({});
      setCoords(current.coords);
    }
    loadLocation();
  }, []);

  if (!permission?.granted) {
    return <Button title="Permitir cámara" onPress={requestPermission} />;
  }

  return (
    <View style={{ flex: 1 }}>
      <CameraView style={{ flex: 1 }} facing="back" />
      <Text>{error || `Lat: ${coords?.latitude} Lng: ${coords?.longitude}`}</Text>
    </View>
  );
}

// Para background location o config nativa: usar development build.
Práctica Expo SDK

Crear pantalla Expo Location + CameraView

Construí una pantalla mínima que instale paquetes del Expo SDK, pida permiso de ubicación, pida permiso de cámara y muestre coordenadas reales antes de avanzar a la app de clima. Este ejercicio comprueba permisos, estados y APIs nativas sin romper cuando el usuario niega acceso.

Datos de entrada

Paquetes: expo-location, expo-camera
Ubicación: requestForegroundPermissionsAsync + getCurrentPositionAsync
Cámara: useCameraPermissions + CameraView
Entorno: dispositivo físico o simulador con Location activado
Objetivo: mostrar coords y preview sin romper si el usuario deniega permisos

Resultado esperado

Si cámara está denegada, aparece un botón para pedir permiso.
Si ubicación está concedida, se imprimen latitude y longitude.
Si ubicación está denegada, aparece un mensaje claro en vez de romper la app.
CameraView solo se renderiza cuando el permiso de cámara está concedido.
El flujo funciona en Expo Go para foreground location; si pasás a background location, preparás development build.

Solución correcta

import { useEffect, useState } from 'react';
import { Button, Text, View } from 'react-native';
import { CameraView, useCameraPermissions } from 'expo-camera';
import * as Location from 'expo-location';

export default function DeviceScreen() {
  const [cameraPermission, requestCameraPermission] = useCameraPermissions();
  const [coords, setCoords] = useState(null);
  const [error, setError] = useState('');

  useEffect(() => {
    async function loadLocation() {
      const { status } = await Location.requestForegroundPermissionsAsync();
      if (status !== 'granted') {
        setError('Permiso de ubicación denegado');
        return;
      }
      const current = await Location.getCurrentPositionAsync({});
      setCoords(current.coords);
    }
    loadLocation();
  }, []);

  if (!cameraPermission?.granted) {
    return <Button title="Permitir cámara" onPress={requestCameraPermission} />;
  }

  return (
    <View style={{ flex: 1 }}>
      <CameraView style={{ flex: 1 }} facing="back" />
      <Text>{error || `Lat: ${coords?.latitude} Lng: ${coords?.longitude}`}</Text>
    </View>
  );
}

Errores comunes

  • - Renderizar CameraView antes de revisar permisos y mostrar una pantalla vacía.
  • - Llamar getCurrentPositionAsync antes de requestForegroundPermissionsAsync.
  • - Pedir ubicación en background cuando solo necesitás foreground location.
  • - Usar el componente antiguo Camera cuando tu SDK ya espera CameraView.
  • - Olvidar npx expo install y mezclar versiones incompatibles del Expo SDK.
  • - Probar solo en web o simulador sin activar ubicación del dispositivo.
Práctica recomendada

Convertí Expo Location en una app de clima

Después de instalar expo-location y expo-camera, pedí permisos, leé latitude/longitude, renderizá CameraView y conectá una API de clima para crear una mini app mobile mostrable.

1. npx expo install expo-location expo-camera 2. Pedir permisos foreground 3. Leer coords 4. Renderizar CameraView 5. Mostrar clima
Crear app con ubicación
De lección a portfolio

Convertí esta lección en una prueba técnica visible.

Una app pequeña publicada, con README y decisiones explicadas, funciona mejor que una lista de tecnologías sueltas.

Paso 1

Creá una demo mínima que use el concepto de la lección.

Paso 2

Escribí un README corto con objetivo, stack, decisión técnica y mejora futura.

Paso 3

Publicá la demo y enlazala desde tu perfil profesional.

Newsletter Cursalo

Recibí rutas y cursos nuevos

Sumate para recibir recursos orientados a empleo y portfolio.

  • Rutas de empleo
  • Cursos prácticos
  • Portfolio y entrevistas

Sin spam. También podés entrar con tu cuenta para guardar progreso. Iniciá sesión