Saltar al contenido

No se puede obtener la posición actual sin GPS en react-native con navigator.geolocation

Te doy la bienvenida a nuestra web, en este sitio encontrarás la respuesta de lo que buscas.

Solución:

El problema con el que está lidiando aquí es con EXPO, porque la API de solicitud de ubicación ha cambiado después de Android 5 (API 21).

Antes de API 21, necesitaba agregar ACCESS_FINE_LOCATION (Proveedores de Wifi / Red y GPS) y ACCESS_COARSE_LOCATION (solo permiso de GPS) permisos de ubicación. Sin embargo, desde Android 5, la API cambia a android.hardware.location.network y android.hardware.location.gps.

Cuando sus usuarios objetivo incluyen tanto Android 5 +/-. debe agregar ambos tipos de permisos a su manifiesto de Android, por ejemplo:


    

    
    
    

Sin embargo, parece que las personas en expo, solo incluyeron, el nuevo permiso en el manifiesto de Android. Entonces, lo que debe hacer es cambiar el manifiesto de Android. Sin embargo, expo solo da acceso a la parte JS pura del programa y no a los códigos nativos. Como resultado, debe desconectarse de EXPO para agregar módulos nativos o cambios.

En la documentación de la expo, el proceso de desprendimiento se explica en este enlace, el procedimiento es sencillo:

  1. instale el paquete expo globalmente usando npm:

    npm install -g exp

  2. Dentro del directorio de su proyecto, ejecute el código de separación, creará carpetas de Android e iOS en el directorio de su proyecto:

    exp detach

Luego, puede realizar los cambios que necesita en el archivo de manifiesto de Android.

Error común en Android. Prueba sin usar el tercer parámetro:

getCurrentLocation = () =>
         navigator.geolocation.getCurrentPosition(
            (position) => 
                let currentUserPosition = position.coords;
                alert(JSON.stringify(currentUserPosition));
            ,
            (error) => 
                console.log(error);
            
        );

Entonces, acabo de indagar un poco en el código y básicamente todo lo que hace LocationModule es enviar la solicitud directamente a Android.

Simplemente llama a este método:

https://developer.android.com/reference/android/location/LocationManager.html#getLastKnownLocation(java.lang.String)

Ahora, si lees eso, la ubicación dice FINE_LOCATION o COARSE_LOCATION.

Por lo general, solo se agregan los permisos de ubicación fina, pero estoy pensando que tal vez para acceder a la ubicación Wifi necesite agregar los permisos generales en la aplicación. ¿Tienes ambos?

https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_COARSE_LOCATION

De lo contrario, agregaría esos permisos a la aplicación y volvería a intentarlo.

Tenía el mismo problema y probé muchas bibliotecas para obtener la ubicación del usuario. La API navigator.geolocation no me dio la ubicación cada vez en Android, sino que solo dio principalmente un error de tiempo de espera. Entonces intenté reaccionar la geolocalización nativa de fondo que comienza a usar el gps continuamente, luego encontré el servicio de geolocalización nativa reaccionar y el autor mencionó claramente que:

Dado que esta biblioteca estaba destinada a ser un reemplazo directo para la API de geolocalización de RN, el uso es bastante sencillo, con algunos casos de error adicionales que manejar.

eso es lo que necesitaba siempre y creo que también deberías probar esto.

Echa un vistazo a esto AndroidManifest archivo, el autor está utilizando todo tipo de ubicación.








para el ejemplo de prueba, simplemente seguirá las mismas instrucciones que sugiere la API de geolocalización de RN. Aquí está un ejemplo simple usando el servicio de geolocalización nativo react:

import Geolocation from 'react-native-geolocation-service';

componentDidMount() 
    // Instead of navigator.geolocation, just use Geolocation.
    if (hasLocationPermission) 
        Geolocation.getCurrentPosition(
            (position) => 
                console.log(position);
            ,
            (error) => 
                // See error code charts below.
                console.log(error.code, error.message);
            ,
             enableHighAccuracy: true, timeout: 15000, maximumAge: 10000 
        );
    

Entonces, en el tercer parámetro de la getCurrentPosition usar enableHighAccuracy false utilizar la red para obtener la ubicación del usuario y true para obtener una ubicación más precisa mediante gps. Consulte la documentación de esta opción.

El autor de este repositorio también proporcionó el proyecto de ejemplo con el que puede probarlo enableHighAccuracy false y apague la ubicación por primera vez, pero cuando ejecute la aplicación, le pedirá el permiso de la ubicación y mostrará que la aplicación desea acceder a wifi o la ubicación proporcionada por la red celular.

Como está usando expo, no puede usar el servicio de geolocalización nativo de reacción, por lo que debe seguir la respuesta de Mojtaba para la separación y obtener el proyecto de Android e iOS para que pueda configurar ambos proyectos. Déjeme saber si usted necesita más información.

Sección de Reseñas y Valoraciones

Recuerda algo, que tienes la capacidad de explicar si diste con el resultado.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *