React-native: La geolocalización 'enableHighAccuracy' en Android siempre se agota

Creado en 10 may. 2016  ·  239Comentarios  ·  Fuente: facebook/react-native

Al desarrollar una aplicación de Android, mientras se depura en mi dispositivo Android que se ejecuta en 6.1, la api de geolocalización siempre devuelve una devolución de llamada de error con el mensaje Location request timed out .

navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log(position);
       },
       (error) => {
        console.log(error)
      },
      {enableHighAccuracy: true, timeout: 20000, maximumAge: 10000}
);

Si cambio la opción enableHighAccuracy a falso, la API funciona bien. En el modo de alta precisión, el tiempo de espera siempre toma el tiempo que especifique en la opción de tiempo de espera, es decir, 20 segundos.

Intenté ejecutar con el modo de desarrollo desactivado.

¿Debería funcionar el modo de alta precisión en Android?

Geolocation Bug Help Wanted Android Ran Commands Locked

Comentario más útil

establecer enableHighAccuracy en true o false no funciona para mí.
omitir el tercer argumento para getCurrentPosition para usar los valores predeterminados del módulo nativo funciona para mí.

Todos 239 comentarios

@ acapop77 Olvidé mencionar también que los permisos se habilitan usando:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Tengo el mismo problema en RN 0.25.1, la diferencia es que, para mí, el problema persiste para la precisión alta y baja. Finalmente encontré algo que lo hace funcionar, pero no es una solución.

Esto es lo que funcionó para mí, asumiendo que usa stock android avd - emulator:

  1. En el dispositivo emulador de Android, vaya a "Configuración> Ubicación" (como lo haría en el dispositivo real) y configure el Modo en Alta precisión.
  2. Regrese a la aplicación.
  3. Presione el botón "Controles extendidos" (representado por "..."). A continuación, en la sección Ubicación, verá los datos del punto de datos GPS y el botón "Enviar" a continuación. Simplemente haga clic en "Enviar" y cierre el menú de controles extendidos.
  4. Vuelva a cargar la aplicación.

Esto funciona para mí, en 'una base única'. Cada vez que quiero volver a cargar la aplicación, tengo que volver a realizar 3-4 pasos. Pero al menos de esta manera hago que la geolocalización funcione y no obtengo el error de tiempo de espera.

Estoy experimentando algo similar en 0.24. Aunque <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> está en mi AndroidManifest.xml, recibo el error rojo que indica:

"Parece que la aplicación no tiene permiso para acceder a la ubicación. Agrega la siguiente línea ..."

No estoy usando el emulador y en su lugar estoy construyendo directamente en el dispositivo.

Editar: esto también sucede en 0.25.1

@ acapop77 @rossthedevigner También estoy construyendo directamente en un dispositivo Samsung S6.

@Findiglay Lo mismo aquí. Incluso intenté hacer una instalación manual de .apk y todavía recibí el error.

Estoy intentando una solución alternativa en la que recorro el manifiesto de permisos y veo si android.permission.ACCESS_FINE_LOCATION está habilitado.

¿Alguien tiene navigator.geolocation == undefined?

Actualmente tengo este problema en mi dispositivo.

Aquí se informan varios problemas. No estoy seguro de que todos sean relevantes para el problema específico con enableHighAccuracy.

No tengo ninguna experiencia con el desarrollo de Android, pero descubrí que si edito LocationModule.java para codificar las LocationOptions boolean highAccuracy = true; y reconstruir, entonces mi ubicación volverá correctamente. No estoy seguro de si los resultados son o no diferentes de los recibidos con la configuración enableHighAccuracy: false en la API de geolocalización React-Native, pero debería ser seguro asumir que esto está operando en modo de alta precisión.

¿Podría esto significar que el error está ocurriendo en el puente entre la API de geolocalización y el módulo de ubicación?

Estoy experimentando el mismo problema. Hice lo mismo que sugirió @Findiglay y trabajé unas cuantas veces, pero luego solo obtuve tiempos de espera.

¿Alguna idea de por qué sucede esto en dispositivos reales? :(

Tener el mismo problema. Actualmente estoy ejecutando la aplicación en dispositivos reales, usando RN 0.25.1.

Debo agregar que ya agregué los permisos necesarios de Android al manifiesto de permisos. Pero aún así los tiempos de espera.

Como solución alternativa, habilité 'Permitir ubicaciones simuladas' en la configuración de Android e instalé una aplicación que se burla del gps (busque gps falsos en la tienda). Al menos hasta que esto se solucione, el desarrollo no se bloquea

Yo chicos
Estaba enfrentando el mismo error pero, después de algunos reintentos con mis colegas, notamos algo extraño (pero normal si lo que te gusta es el GPS).

Si ejecuta pruebas "dentro de su oficina" utilizando un dispositivo físico, el localizador GPS puede verse afectado por elementos externos como paredes, o por el simple motivo de que está intentando realizar esta operación "en interiores" y, en general, esto debe realizarse en exteriores. .

Bueno, después de esto salimos de nuestra oficina, volvemos a ejecutar las pruebas y el dispositivo responde según lo planeado (no recibimos el error de Solicitud agotada).

Mi sugerencia es: pruebe la geolocalización usando "enableHighAccuracy" establecido en verdadero, si esto falla (en la oficina esto puede fallar), vuelva a intentarlo con falso, esto debería funcionar, en mi caso lo hizo.

Espero que esto pueda ayudar.

+1

El mismo problema aquí si enableHighAccuracy se establece en true o false .
Funciona en emuladores GenyMotion pero no en ningún dispositivo real (probado en Samsung, Nexus, Mi).
Permiso habilitado en AndroidManifest.xml
Código:

                navigator.geolocation.getCurrentPosition(
                    (position) => {
                        console.log(position);
                    },
                    (error) => console.log(new Date(), error),
                    {enableHighAccuracy: true, timeout: 10000, maximumAge: 3000}
                );  

establecer enableHighAccuracy en true o false no funciona para mí.
omitir el tercer argumento para getCurrentPosition para usar los valores predeterminados del módulo nativo funciona para mí.

El mismo problema aquí con LGE Nexus 5 (Android 6.0).
En Android 5.1.1 y 4.3 no existe tal problema.
En el emulador con Android 6.0 no existe tal problema.
boolean highAccuracy = false; no funciona.
RN 0,28,0.

Hola chicos, he encontrado una solución temporal: este paquete https://github.com/lucasferreira/react-native-android-permissions

¿Alguna actualización o solución para esto? Todo funciona bien en Simulator y dispositivos anteriores a 5.0, después de ese solo tiempo de espera, ¡y necesito desesperadamente una solución para una aplicación ya disponible!

+1

Este problema se ve afectado por la configuración locationMode del dispositivo. Cuando el modo de ubicación está configurado en alta precisión o solo en dispositivo, la geolocalización se agota. Funciona correctamente cuando el modo de ubicación está configurado para ahorrar batería

Tuve el mismo problema, hice una patada y eliminé el tercer argumento. Y ahora está funcionando.

navigator.geolocation.getCurrentPosition( (position) => { console.log(position); }, (error) => console.log(new Date(), error), {enableHighAccuracy: true, timeout: 10000, maximumAge: 3000} //removed this );

No, eso fue por el problema del tiempo de espera de la ubicación

Sí, acababa de descubrir que eliminar el tercer argumento parece ser una solución.

Aún no hemos probado completamente el dispositivo, pero parece que la versión 22 de Android, con el modo de dispositivo configurado en alta precisión o solo en dispositivo, hará que la ubicación se agote, cuando el tercer argumento se incluye independientemente de la configuración. Parece no afectar la versión 23 de Android.

La misma experiencia de mi lado, excepto que la versión 23 de Android solo funciona con el tercer argumento cuando enableHighAccuracy se establece en false ( true hace que la ubicación se agote). También probado en la versión 22, 21, 20 y 19 de Android y parece que la presencia del tercer argumento provoca un tiempo de espera en todos los casos. Eliminar ese argumento parece ser la única solución confiable.

La eliminación del tercer argumento solo me hace tener la ventana emergente de "Solicitud de ubicación agotada" instantáneamente en lugar de esperar hasta que finalice el tiempo de espera. Establecer enableHighAccuracy en falso tampoco funciona.

En mi emulador, la ubicación solo está disponible cuando abro la configuración del emulador y envío una ubicación (verifique la captura de pantalla).

¿Hay alguna forma de obtenerlo automáticamente?

screen shot 2016-08-21 at 6 42 52 pm

En mi caso, configurar enableHighAccuracy en false resolvió el problema.

Tener el mismo problema aquí, tanto en el emulador como en el dispositivo, y probé con true y false para enableHighAccuracy

Simplemente obtengo "undefined no es un objeto (evaluando 'navigator.geolocation.getCurrentPosition')"

Intenté verificar si (navegador), eso devolvió verdadero,
pero si (navigator.geolocation) devolvió falso.

Además, hacer esto en el dispositivo con Android 5.1 OnePlus One. Modo de desarrollador habilitado, permisos de AndroidManifest incluidos, ubicaciones simuladas activadas / desactivadas, todo.

Además, no parecía pedirme permisos de ubicación, a pesar de que eliminé la aplicación en el dispositivo y la carpeta de salida en mi mac.

En realidad, tampoco puedo depurar de forma remota ya que estoy usando React Realm y esa cosa tiene ENORMES problemas que arruinan el depurador remoto de Chrome de adentro hacia afuera.

Tengo un problema similar, puede que la aplicación no siempre se agote, PERO lo hace mucho, cuando otras aplicaciones de geolocalización funcionan bien cada vez que la que tiene RN tiene una geolocalización muy pobre.
Estoy usando RN 0.32 pero tuve el mismo problema con cada versión, por alguna razón la geolocalización en RN es muy extraña y pobre (al menos en Android)

El mismo problema aquí, probando en un dispositivo real.

Encontrar esto y esto es realmente molesto: /

Tengo el mismo problema en Android 6.0.

+1

Encontré que una solución era no agregar un tercer parámetro y usar la biblioteca vinculada anteriormente (https://github.com/lucasferreira/react-native-android-permissions) en la versión de Android> = 23 para solicitar permisos de Android M.

Permisos recién detectadosAndroid ahora se ha agregado a RN. Entonces use esto para solicitar si en Android> = 23

https://facebook.github.io/react-native/docs/permissionsandroid.html

Pero tengo Android 5.1.1 en mi dispositivo. En esta versión de Android, la geolocalización debe funcionar bien, ¿no?

23 es 6.0 en adelante. También descubrí que necesitaba no agregar el tercer parámetro para que funcione en todo.

Logré que esto funcionara, pero podría ser diferente para ti. Las versiones más recientes de RN (la mía es 0.32.1) incluyen un archivo llamado MainApplication.java (además de MainActivity.java). React Native Mapbox GL Docs dice que debe incluir el ReactNativeMapboxGLPackage en MainActivity.java, pero debe hacerlo en MainApplication.java para que se vea así:

MainApplication.java

'. . .

<strong i="8">@Override</strong>
protected List<ReactPackage> getPackages() {
  return Arrays.<ReactPackage>asList(
      new MainReactPackage(),
      new ReactNativeMapboxGLPackage()
  );
}

};
'

Y MainActivity.java seguiría siendo el mismo de siempre.

Mi versión de Android es 23, así que sigo usando los permisos del manifiesto xml

Con el GPS activado en el dispositivo, la aplicación devuelve la ubicación correctamente, pero si la apago, la ubicación devuelve: error: No available location provider.

¿Cómo puedo forzar el dispositivo a una ubicación GPS activa?

Esto es enloquecedor = /

Tenía getCurrentPosition trabajando en mi emulador de Android Genymotion durante las últimas semanas, pero ahora vuelve a fallar.

Estoy usando el widget GPS de Genymotion para establecer la ubicación. He instalado Google Maps en el emulador y Google Maps puede leer mi ubicación sin problemas.

Tengo todos los permisos necesarios e incluso estoy usando el módulo PermissionsAndroid como sugirió @sattaman . Parece que el comportamiento no es determinista, en el sentido de que funciona un día y se rompe al siguiente.

Estoy en RN 0.31 y la eliminación del tercer parámetro también funcionó para mí. Dispositivo real, Nexus 5X, Android 6.

Tengo el mismo problema en RN 0.34.1, pero eliminar el tercer parámetro puede solucionarlo
Establecer enableHighAccuracy en falso no resuelve este problema

El mismo problema conmigo en RN 0.32, probé con Android 22 y 23,

enableHighAccuracy en verdadero o falso, no me funciona
la eliminación del tercer parámetro provoca "tiempo de espera de solicitud de ubicación" inmediato
sin embargo, reiniciar mi dispositivo funciona, pero se romperá después de un tiempo,

ahora, para obtener la ubicación de los usuarios, solo uso esto:
https://github.com/mauron85/react-native-background-geolocation

@acondense, ¿dónde configura el código para la geolocalización en segundo plano, porque no parece estar ejecutando la función de ubicación

Encontré el mismo problema en RN 0.35 con Android 23 y 24, sin embargo, funciona bien con Android 22.
Podría estar relacionado con el sistema de permisos en tiempo de ejecución de Android 6.0:
http://stackoverflow.com/questions/32224534/access-fine-location-permission-error-emulator-only

¡Utilizo esta biblioteca para evitar este problema y funciona bien!
https://github.com/yonahforst/react-native-permissions

Eliminar el tercer parámetro lo solucionó para mí también 💯 💯 💯

Eliminar el tercer parámetro funcionó 👍

No estaba tan claro desde el principio de qué parámetro estaba hablando todo el mundo, el parámetro del método o el tercer parámetro del objeto de opciones.

Para ser precisos, es el tercer parámetro del método getCurrentPosition , que se parece a eso al final:

navigator.geolocation.getCurrentPosition(
    (position) => {
       ...
    },
    (error) => alert(error.message)
)

Finalmente vine con la siguiente solución (la misma idea descrita anteriormente):

export const detectCurrentLocation = (successCallback, errorCallback) => {
    let navigatorOptions = {}
    if (Platform.OS === 'android' && Platform.Version === 23) {
        navigatorOptions = {
            enableHighAccuracy: false,
            timeout: 10000,
            maximumAge: 0
        }
    }

    navigator.geolocation.getCurrentPosition(
        position => successCallback(detectedLocation),
        error => errorCallback(error),
        navigatorOptions
    )
}

Funciona en dispositivos (probado en Android 21, 22 y 23), pero para Android 23 es críticamente lento: 5 - 10 segundos.

¿Alguien ha usado LocationServices.FusedLocationApi como una solución para este propósito en react-native (implementando de forma nativa, en código Java para Android)?

enableHighAccuracy: true no funcionan en Android en absoluto

Estoy usando este código para verificar el permiso de ubicación en Android 6

requestLocationPermission = async () => {
    try {
      const granted = await PermissionsAndroid.requestPermission(
        PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
        {
          'title': 'Enable location',
          'message': 'Location is good \o/',
        },
      );

      if (granted) {
        console.log('You can use the location');
        this.getLocation();
      } else {
        console.log('Location permission denied');
      }
    } catch (err) {
      console.warn(err);
    }
  };

@sibelius ¿ Esto evita el error Location request timed out ?

use mi fragmento y este también https://github.com/facebook/react-native/issues/7495#issuecomment -259753488

¿Todavía no hay solución para esto? He intentado absolutamente todo en este hilo y nada me funciona, siempre es un error de tiempo de espera, ya sea instantáneamente o después de unos segundos.

Lo mismo aquí, el comentario de @sattaman lo arregló para mi dispositivo (configurando el modo de ubicación para ahorrar batería), sin embargo, ¡cómo decirle a los usuarios de la aplicación que hagan tal cosa!

Deshabilitar enableHighAccuracy u omitir el tercer parámetro funciona para mí. Sin embargo, la ubicación todavía parece bastante precisa.
No hay problemas en iOS. (RN 0,39)

RN 0.40 mismo problema. Eliminar el tercer parámetro lo resuelve.
(Pero no obtienes alta precisión)

mismo problema, eliminando el tercer parámetro lo soluciona.

En un emulador, tengo que configurar enableHighAccuracy: true y asegurarme de que el modo de ubicación esté configurado en Alta precisión. De lo contrario, se agota el tiempo. No puedo ahorrar batería en un emulador bajo ninguna circunstancia.

En un dispositivo, no paso ninguna opción. Si está luchando con esto como yo, sugiero que lo pruebe en dispositivos reales. Probé en un Pixel C (Android 7.1) y Note 4 (Android 6.0.1)

En iOS, tuve que establecer Alta precisión en Verdadero. Puedes imaginar mi función de obtención de ubicación en este punto ...

Estoy trabajando en RN 0.40 y usando un dispositivo real (Nexus 5) y sigo teniendo el problema.

Intenté cualquier cosa de todos los comentarios en este número.

¿Alguien resolvió el problema de alguna otra manera, no mencionada aquí?

// ACTUALIZAR:

Parece que navigator.geolocation.watchPosition funciona. Por lo tanto, usarlo podría ser la solución alternativa hasta que se solucione navigator.geolocation.getCurrentPosition.

Por ahora, escribiré un módulo nativo y hablaré directamente con las API nativas, porque el uso de alta precisión es importante para mí.
La API de geolocalización de RN parece inestable por ahora.

En mi proyecto, descubro algunas reglas.

  1. la configuración del dispositivo Android: la ubicación es solo el dispositivo, NO debe configurar enableHighAccuracy: true para getCurrentPosition
  2. la configuración: la ubicación es de alta precisión, debe establecer enableHighAccuracy: true para getCurrentPosition

De acuerdo con estas dos reglas, las cosas funcionan bien en mi proyecto.

@kimochg ¿cuál es su configuración de prueba?

En mis pruebas, establecer la configuración del dispositivo para Ubicación en Solo dispositivo dará como resultado un timeOut cada vez, independientemente de cuál sea la geolocalización enableHighAccuracy .

Establecer la configuración del dispositivo en Alta precisión me dará una ubicación válida independientemente de lo que esté configurado enableHighAccuracy .

EDITAR
Parece que, para mí, la geolocalización solo buscará una ubicación nueva si configuro enableHighAccuracy: false y la configuración de ubicación del dispositivo como Alta precisión. Con enableHighAccuracy: true buscará una ubicación en caché, pero se agotará el tiempo de espera de una nueva búsqueda.

Esto está en React Native 0.40, probando en Nexus 5X con Android 7.1.1

@kulmajaba algunos como React Native 0.40, probando en Nexus 5X con Android 7.1.1
pero el emulador de Android aquí, no es un dispositivo Android real

si estás usando un emulador,
¿Hace clic en el botón 'Controles extendidos' en la barra derecha del emulador y envía datos GPS?
(el botón)

@kimochg Ok. Estoy usando un dispositivo real para las pruebas, tendré que comparar el comportamiento del emulador con eso la próxima vez que esté trabajando en el proyecto.

@Ascendance @ Daniel-ltw Seguí todas las soluciones en este hilo y no pude deshacerme de los temidos problemas indefinidos de navigator.geolocation. Luego registré navigator .

Esto es lo que obtuve:

ProxyComponent
_attachGesture
_cleanScenesPastIndex
_clearTransformations
_completeTransition
_deltaForGestureAction
_detachGesture
_disableScene
_disableTVEventHandler
_doesGestureOverswipe
_eligibleGestures
...

Entonces me di cuenta de que esto provenía del componente Navigator. Utiliza (route, navigator) al representar rutas. Efectivamente, eliminar la variable del navegador y volver a iniciar sesión produjo:

WorkerNavigator
appCodeName
appName
appVersion
geolocation (...)
get geolocation
getValue()
set geolocation
setValue(newValue)
hardwareConcurrency

Espero que esto ayude a alguien más; me tomó una cantidad de tiempo triste darme cuenta de cuál era el problema. : /

@kulmajaba el maximumAge solucionó cualquier problema de almacenamiento en caché para mí. Establecerlo en 0 lo obligará a obtener siempre una nueva posición.

Para cualquier otra persona que esté luchando con el problema del tiempo de espera, he leído que a veces las llamadas de GPS de alta precisión pueden demorar un tiempo (más de un minuto), especialmente en interiores, como @RoBYCoNTe señaló anteriormente.

Confiar en una llamada de alta precisión desde el principio puede no ser lo mejor, tal vez obtener una llamada de baja precisión primero y comenzar una llamada de alta precisión en segundo plano sería un mejor enfoque. Esto depende de sus necesidades, por supuesto, esperar un minuto + por una llamada no es para todos :)

Además, dado que RN amplía la especificación web para la geolocalización, puede encontrar respuestas relacionadas con ella en la web, como http://stackoverflow.com/questions/3752383/geolocation-is-so-slow-what-im- haciendo mal

¿Alguien tiene una solución sólida? Algunos usuarios ni siquiera pueden registrarse en mi aplicación debido a que parte del registro requiere que configuren su geolocalización. El problema solo ocurre en algunos dispositivos Android y no estoy usando el tercer parámetro. Me vuelve loco. La gente simplemente le da a mi aplicación reseñas de 1 estrella automáticamente porque no pueden configurar su geolocalización, jajaja. >.>

@booboothefool intente usar el parámetro de opciones y pase highAccuracy como
falso. Los resultados son mucho más rápidos de esa manera.

El lunes 20 de febrero de 2017 a las 9:50 a.m. booboothefool [email protected]
escribió:

¿Alguien tiene una solución sólida? Algunos usuarios ni siquiera pueden registrarse en mi
aplicación debido a que parte del registro requiere que configuren su geolocalización.
El problema solo ocurre en algunos dispositivos Android, y no tengo
utilizando el tercer parámetro. Me vuelve loco.

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-281142941 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ADJE_BC-osVA45bcpejEI_paDEBykBs1ks5redJtgaJpZM4Ibete
.

@greyvugrin Está bien, le daré una oportunidad. ¿Por qué la mitad de las personas informan que "es necesario eliminar el tercer parámetro, pero configurar enableHighAccuracy en falso no funciona"? Parece que todo el mundo está diciendo algo diferente.

También basado en esto: https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions

Parece que esas son las opciones predeterminadas. enableHighAccuracy: false con timeout: Infinity , entonces, ¿no debería estar haciendo eso si no proporciono el tercer parámetro?

@booboothefool , tienes razón en que este hilo es confuso. Por lo que puedo decir, las personas que omiten el parámetro de opciones podrían haber resuelto su problema porque algo más en la configuración estaba afectando las cosas.

establecer enableHighAccuracy en verdadero o falso no funciona para mí.
omitir el tercer argumento para getCurrentPosition para usar los valores predeterminados del módulo nativo funciona para mí.

Entonces, el problema puede haber sido con timeout . Hay muchos factores que intervienen en la geolocalización, por lo que será útil obtener la mayor cantidad de información posible de las personas que se bloquean.

Si ya tenía las opciones eliminadas y RN de hecho tiene los mismos parámetros que web, las cosas deberían estar funcionando bien. Si aún tiene problemas, tal vez vea si los usuarios tienen permisos habilitados para la ubicación (y lo está verificando en su aplicación).

Hola @greyvugrin ,

Gracias por el gran consejo sobre los permisos. Creo que eso es lo que me estaba perdiendo. Después de implementar https://github.com/lucasferreira/react-native-android-permissions (prefiero esta API sobre https://facebook.github.io/react-native/docs/permissionsandroid.html), junto con especificar enableHighAccuracy: false , y estableciendo un timeout , parece funcionar para todos ahora.

Mi aplicación pasó de 1 estrella en Google Play Store y todos la tiraron a la basura por problemas de geolocalización a 3.6 estrellas, ¡jajaja! 👍

@booboothefool es una gran noticia, ¡me alegro de escucharla!

Probé todos los enfoques sugeridos aquí. No se puede obtener nada de getCurrentPosition excepto tiempos de espera en el simulador o dispositivo en Android. watchPosition funciona pero realmente no ofrece la mejor UX para el usuario, solo necesito la ubicación del usuario una vez, no es necesario que mantenga el GPS gastando su batería.

He intentado:

  • enableHighAccuracy: falso
  • eliminar el argumento de opciones
  • comprobar y pedir permiso android> = 23
  • Ambos, FINO Y GRUESO en manifiesto.

Ninguno cambia los tiempos de espera de getCurrentPosition

Esto es solo algo que los desarrolladores de Android Studio Emulator tendrán que arreglar / implementar en el futuro cuando tengan la oportunidad.

Sin embargo, mientras tanto ... Puede importar un archivo de ruta GPX grande y dejar que se reproduzca a una velocidad de "1x". Cogí un GPX desde aquí ... ExpertGPS.com -> ca-trail.gpx
... este archivo duró unos 8 minutos a una velocidad "5x", por lo que a una velocidad "1x" DEBERÍA durar unos 40 minutos.

Cárguelo (u otro archivo GPX posiblemente más grande) en [...] Opciones extendidas-> Ubicación (botón Cargar GPS / KML en la parte inferior derecha), presione el botón de reproducción, luego cierre la ventana ... seguirá reproduciéndose hasta que llegue al final. Lástima que no haya repetición automática, otra solicitud de función para los programadores de Android Studio. :-)

Eso no es cierto. Obtengo los mismos tiempos de espera en dispositivos reales.
getCurrentPosition siempre se agota. El reloj funciona bien. Probando Z5, Nexus 5X
& Pixel, todo el tiempo de espera en la llamada inicial para getCurrentPosition.

El sábado 4 de marzo de 2017 a las 19:49, Deen Foxx, [email protected] escribió:

Esto es solo algo que los desarrolladores de Android Studio Emulator van a hacer
tienen que arreglar / implementar en el futuro cuando tengan la oportunidad.

Sin embargo, mientras tanto ... Puede importar un archivo de ruta GPX grande y dejar
se reproduce a una velocidad "1x". Cogí un GPX desde aquí ... ExpertGPS.com ->
ca-trail.gpx
https://www.expertgps.com/data/downloading.asp?file=ca/ca-trails.gpx
... este archivo duró unos 8 minutos a una velocidad "5x", por lo que a una velocidad "1x"
DEBE durar unos 40 minutos.

Cárguelo (u otro archivo GPX posiblemente más grande) en el [...] Extended
Opciones-> Ubicación (botón Cargar GPS / KML en la parte inferior derecha), presione el botón de reproducción
, luego cierre la ventana ... seguirá jugando hasta que toque el
fin. Lástima que no haya repetición automática, otra solicitud de función para Android
Programadores de estudio. :-)

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-284172310 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AACQ6AoZYXJ02DCmevcLmmF3tuOdg_SEks5ribJHgaJpZM4Ibete
.

Eliminar el tercer parámetro para getCurrentLocation funcionó para mí en el emulador.

{
   timeout: 20000,
    maximumAge: 1000
}

Solo codifiqué una posibilidad de tres pasadas. Quizás un poco exagerado, pero bueno. Aquí está el fragmento de código (con comentarios) ...

class FindNearMe extends Component {

  constructor(props) {
    super(props);

    this.state = {
      prevLatitude: 0.0,
      prevLongitude: 0.0,
      gotLocation: false,
      locating: false,
      loading: false
    };
  }

  handleGeolocationSuccess = (position) => {

    // Get a response, say we are done locating, even if it is still looking for a fine result.
    this.setState({ locating: false });

    // If we previously failed, we can clear the error if it just happens to still be visible.
    if (!this.state.gotLocation) {
      this.props.navigator.hideLocalAlert();  // Hide possibly open alert.
      this.setState({ gotLocation: true });  // Remove the previous failure state.
    }

    // Only proceed if there is an actual change in location.
    if (this.state.prevLatitude != position.coords.latitude ||
        this.state.prevLongitude != position.coords.longitude) {

      // Overwrite the old location with the new location.
      this.setState({
        prevLatitude: position.coords.latitude,
        prevLongitude: position.coords.longitude,
        loading: true // Only needed if you plan to get content from server.
      });

      // ... DO SOMETHING WITH THE UPDATED LOCATION ...
      // If you used a callback function (success or failure) be sure to include this...
      this.setState({ loading: false });
 };

  // This first, RoughError, means the "enableHighAccuracy: false" time-out occurred.
  handleGeolocationRoughError = (error) => {
    this.props.navigator.showLocalAlert('Attempting to pinpoint your location...', config.errorStyles);
    // Invalidate our current location
    this.setState({ gotLocation: false });
  };

  // This second, FineError, means the "enableHighAccuracy: true" time-out occurred.
  handleGeolocationFineError = (error) => {
    // If we got Rough location, I'm ignoring this. But, if neither rough nor fine succeeded...
    if (!this.state.gotLocation) {
      // ...try once more without the options.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationFinalError
      );
    }
  };

  // This last, FinalError, means nothing worked and we're giving up.
  handleGeolocationFinalError = (error) => {
    if (!this.state.gotLocation) {
      this.props.navigator.showLocalAlert('Could not determine your location, sorry!', config.errorStyles);

      // Let our app know that we are not trying anymore.
      this.setState({ locating: false });
    }
  };

  goToNearMe = () => {
      // Track when we are attempting to get a location update.
      this.setState({ locating: true });

      // Try to get the rough location quickly.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationRoughError,
        {
          enableHighAccuracy: false,
          timeout: 500,  // I have this set for half-second before popping up the alert.
          maximumAge: 0
        }
      );

      // But, also, simultaneously try to get the fine location.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationFineError,
        {
          enableHighAccuracy: true,
          timeout: 7500,  // I have this set for 7.5 seconds, about the length of the first alert's visibility.
          maximumAge: 0
        }
      );
  };

  render() {
    return (
        <Container>
          <LocateMeButton
              onPress={this.goToNearMe}
              loading={this.state.loading || this.state.locating}
          />
          <Header>
            Use Current Location
          </Header>
        </Container>
    );
  }
}

export default FindNearMe;

Solo he probado esto en emuladores de desarrollo locales, no en producción. Hágame saber si esto fue útil para usted.

Estaba pensando ... probablemente funcionaría perfectamente como un paso de dos si tu llamada roughError solo usa la versión sin opciones ...

  goToNearMe = () => {
      // Track when we are attempting to get a location update.
      this.setState({ locating: true });

      // Try to get the rough location quickly.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationRoughError,
// Just leave this off entirely (but default timeout is Infinity, so you'd never get the first alert!)...
//        {
//          enableHighAccuracy: false,
//          timeout: 500,  // I have this set for half-second before popping up the alert.
//          maximumAge: 0
//        }
// ...or try ujwal-setlur's method of leaving off the enableHighAccuracy portion...
        {
          timeout: 500,
          maximumAge: 0
        }
// NOTE: ujwal-setlur's method did NOT work for my Android emulator.
//             I had to comment out the options object completely for it to not time-out.
      );

      // But, also, simultaneously try to get the fine location.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
//        this.handleGeolocationFineError,  // Wouldn't need this, make it your FinalError instead.
        this.handleGeolocationFinalError,
        {
          enableHighAccuracy: true,
          timeout: 7500,  // I have this set for 7.5 seconds, about the length of the first alert's visibility.
          maximumAge: 0
        }
      );
  };

Eso haría que los teléfonos Android con problemas ya no tuvieran demora, pero aún así intentarían la alta precisión. Entonces ya no necesitaría el FineError en absoluto, ese código se puede eliminar.

  • Sí, sé que existe una pequeña posibilidad de que el intento de "enableHighAccuracy: true" regrese antes que los otros resultados asincrónicos "aproximados" (especialmente si el tiempo de espera es Infinity) y por lo tanto se pierda / sobrescriba ... pero lo dudo. Si realmente desea ser tan cauteloso, puede modificar el código para probar ese caso en particular.

¿Algún progreso en esto?

Alex, hay algunas soluciones en este hilo. Que has probado Eso
También puede valer la pena crear un nuevo ticket una vez que tenga más detalles, ya que
este hilo es tan largo, si ninguna de las soluciones anteriores funciona.

El viernes 17 de marzo de 2017, 10:29 a.m. Alex Sinelnikov [email protected]
escribió:

¿Algún progreso en esto?

-
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-287419487 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete
.

Como tú. Ninguna de las sugerencias anteriores funciona. La única solución para mí
obtener una ubicación en Android era usar un reloj y actualizar la interfaz de usuario para informar
el usuario lo que sucede si las funciones de sus aplicaciones responden en locat. No
molestarse con getCurrentPosition no funciona en ninguna de las 10 pruebas reales
dispositivos que tenemos ejecutando varias versiones de Android 4+

El viernes 17 de marzo de 2017 a las 17:48 Gray Vugrin, [email protected] escribió:

Alex, hay algunas soluciones en este hilo. Que has probado Eso
También puede valer la pena crear un nuevo ticket una vez que tenga más detalles, ya que
este hilo es tan largo, si ninguna de las soluciones anteriores funciona.

El viernes 17 de marzo de 2017, 10:29 a.m. Alex Sinelnikov [email protected]
escribió:

¿Algún progreso en esto?

-
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
<
https://github.com/facebook/react-native/issues/7495#issuecomment -287419487
,
o silenciar el hilo
<
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete

.

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-287424598 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AACQ6DgWuUzw4hj7rmr8LDzcRHjEheIcks5rmsdSgaJpZM4Ibete
.

A veces funciona, otras no. He probado TODAS las soluciones anteriores y hasta ahora ninguna solución confiable. Esto realmente me vuelve loco :(

¿Hay algún módulo nativo que reproduzca una función como getCurrentPosition? Estoy buscando otro repositorio porque no puedo escribir código java.

watchPosition tiene un problema cuando la ubicación no está habilitada. Nunca arroja tiempo de espera aunque establezco un tiempo de espera = 1000

En 'getCurrentPosition', arrojará tiempo de espera, por lo que puedo activar el cuadro de diálogo Ubicación para habilitar el GPS. Pero ahora paso de 'getCurrentPosition'

EDITAR:
He probado todas las variaciones y ahora sé dónde está el problema. Puedo hacerlo funcionar si elimino los terceros parámetros Y configuro el modo de ubicación en Alta precisión o Ahorro de batería. De lo contrario, no funciona. No sé cómo decirle al usuario que elija Alta precisión o Ahorro de batería en lugar de Solo dispositivo, porque tiene una forma diferente de acceder a este menú para cada proveedor.

Hay un comentario arriba para agregar enableHighAccuracy: false en terceros parámetros, pero no funcionó para las opciones de Alta precisión, Ahorro de batería o Solo dispositivo. Creo que los terceros parámetros en la geolocalización son inútiles para un dispositivo real.

location-mode-100621707-large

En mi caso, eliminar maximumAge resolvió el problema.

La eliminación de maximumAge funciona, pero esta es una solución temporal. Funcionó bien en la mayoría de los casos, pero encontré algunos problemas en la producción donde en un mapa la ubicación actual del usuario estaría completamente fuera de lugar debido al uso de coordenadas obsoletas. En su lugar, cambió a una implementación nativa.

@nigelnindo ¿a qué te refieres con la implementación nativa? dentro de RN o hacerlo directamente en Android?

@ L3V147H4N directamente en Android. Hay un par de bibliotecas que puede usar para esto, pero he visto que la mayoría no son compatibles con las últimas versiones de RN. Si hay suficiente interés en esto, no me importa dedicar algo de tiempo a crear un módulo simple para ayudar a resolver los problemas de geolocalización en Android descritos en este hilo.

Tal vez puedas consultar https://github.com/mauron85/react-native-background-geolocation#getlocationssuccess -fail

Es una implementación nativa y me está funcionando bien.

Creo que casi todos en este hilo estarían muy agradecidos @nigelnindo
https://github.com/nigelnindo

El lunes 3 de abril de 2017 a las 17:34, Nigel Nindo [email protected] escribió:

@ L3V147H4N https://github.com/L3V147H4N directamente en Android. Existen
un par de bibliotecas que puede usar para esto, pero he visto que la mayoría
no son compatibles con las últimas versiones de RN. Si hay suficiente
interés en esto, no me importa dedicar algo de tiempo a crear un módulo simple
para ayudar a resolver los problemas de geolocalización en Android descritos en este hilo.

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-291198134 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AACQ6BwArzmfCk3TXfiRMp7kpdwMLM81ks5rsR-hgaJpZM4Ibete
.

La frustración ... Estoy tratando de usar navigator.geolocation.getCurrentPosition pero sigo recibiendo el error:
Se agotó el tiempo de espera de la solicitud de ubicación. Para Android, iOS funciona bien.
He intentado configurar enableHighAccuracy en True / False, eliminando el tercer argumento, he agregado los permisos de ubicación COURSE y FINE en AndroidManifest.

SDK de Android 23, herramientas de compilación 25.0.0
Reaccionar 16.0.0-alpha.6
RN 0.43.3

¡Gracias por tu ayuda!

Bienvenido al hilo Douglas, lamentablemente getCurrentPosition no es
confiable en Android como has descubierto.
Eche un vistazo a algunas de las soluciones anteriores en el hilo usando
watchPosition lugar

Gracias @raldred.
watchPosition parece estar funcionando, ¡agradezco la ayuda!

@douglaswissett de nada . Con suerte, pronto habrá una solución sólida para getCurrentPosition .

¿Puedo usar watchPosition luego clearWatch inmediatamente después de obtener la posición geográfica? Tengo problemas para hacer esto, porque clearWatch solo se puede llamar en componentDidMount

@pewh sí. Eso es lo que hago.
También se puede llamar a navigator.geolocation.clearWatch cualquier momento.
Simplemente mantenga una referencia al watchID en su componente que es devuelto por el llamado a watchPosition

De los documentos que leí en https://facebook.github.io/react-native/docs/geolocation.html , no tengo idea de cómo obtener this.watchID dentro de watchPosition callback. Mi caso de uso es el disparador clearWatch inmediatamente después de recibir el nuevo valor.

@pewh aquí está mi implementación. No es perfecto pero funciona.
https://gist.github.com/raldred/b08cf60712eb87d81f05437444dff4ae

@raldred probó tu solución y la de todos los demás, nada funciona

¿Alguna solución al respecto? prueba todo aquí y nada parece funcionar, ¡por favor ayuda! si puedes compartir algunos fragmentos o algo

@ gerard0315, ¿consigues algo de éxito resolviendo esto?

Parece funcionar en un teléfono Android real para mí

Obtenga Outlook para iOS https://aka.ms/o0ukef


De: Jorge Almonacid [email protected]
Enviado: martes, 9 de mayo de 2017 2:29:56 p.m.
Para: facebook / react-native
Cc: Ujwal Setlur; Comentario
Asunto: Re: [facebook / react-native] La geolocalización 'enableHighAccuracy' en Android siempre se agota (# 7495)

¿Alguna solución al respecto? prueba todo aquí y nada parece funcionar, ¡por favor ayuda! si puedes compartir algunos fragmentos o algo

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 , o silencie el hilo https://github.com/notifications/unsubscribe-auth/ AFkMXWcokXoYDpsw28UaiUSDtCvRpE3Rks5r4NrUgaJpZM4Ibete .

Ya he compartido mis fragmentos que SÍ funcionan en dispositivos reales que se ejecutan
Android 4-7.

El martes 9 de mayo de 2017 a las 22:29, Jorge Almonacid, [email protected] escribió:

¿Alguna solución al respecto? prueba todo aquí y nada parece funcionar,
¡por favor ayuda! si puedes compartir algunos fragmentos o algo

-
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AACQ6HSlN8YS_jE6NY9w2vuk7Hv4Wjwfks5r4NrSgaJpZM4Ibete
.

Actualmente, es posible obtener una actualización (en el emulador de Android) solo si cambia todos los parámetros (Longitud, Latitud, Altitud) al mismo tiempo. Si cambia solo uno o dos - nothing works .

Hay una falla innata en la forma en que React-Native maneja la ubicación en Android. (iOS parece no tener este problema, iirc)

String provider = highAccuracy ? LocationManager.GPS_PROVIDER : LocationManager.NETWORK_PROVIDER;

LocationManager.GPS_PROVIDER is best for outdoors when you have a clear view of the sky

mientras

LocationManager.NETWORK_PROVIDER is best for indoors, since it uses networks (and cell towers?)

En realidad, necesita ambos / todos los proveedores si desea una ubicación súper precisa. Luego, desea comparar la precisión, la marca de tiempo y aceptar la ubicación más precisa y fresca.

Hay dos formas de hacer esto:

En Reaccionar:

Configure dos watchID variables -> watchIDGPS y watchIDNetwork . Luego configure dos observadores, uno con enableHighAccuracy=true y enableHighAccuracy=false esto devolverá tanto el proveedor de GPS como el proveedor de red (la red será más precisa en interiores)

El problema con la forma React es que está haciendo esto en el hilo JS; Esto podría congelar su aplicación en dispositivos que carecen de recursos. No obstante, funciona.

En nativo:

Querrá reescribir el LocationModule.java como un módulo personalizado para manejar los proveedores de su elección e informar la ubicación al mLocationListener independientemente del proveedor que sea. Hasta que React-Native solucione este "problema".

@ralred , Gracias por el fragmento, pero ¿qué es el objeto AndroidPermissions ?

Probé todas las soluciones, todas fallaron ...
De repente recordé que mi aplicación tiene un módulo de mapa, el mapa baidu, un mapa chino (map.baidu.com) como el mapa de Google, ¡puede obtener marcadores y ubicación actual! Finalmente lo logré ~

puedes buscarlo por github, react-native-baidu-map

importar {
MapView, // la vista del mapa (no la necesito)
MapTypes, // escriba como 2D o 3D (no lo necesito)
Geolocalización // api sobre la ubicación (necesito)
} de 'react-native-baidu-map';

componentDidMount () {
Geolocation.getCurrentPosition ()
.entonces (datos => {
Alert.alert (JSON.stringify (data.latitude), JSON.stringify (data.longitude))
})
}

No sé si puedo trabajar en otro país, solo un pensamiento usando algunas aplicaciones de mapas, puedes probar react-native-maps u otros mapas ...

Nada funciona, watchPosition ni siquiera se llamará en Android, iOS funciona perfectamente. ¿Ya es RN v0.45.0 (actualmente estoy en 0.44.0) y todavía no está resuelto? ¡Venga!

@rexlow
Nada funciona tan bien, estoy usando la versión 0.44. ¿Ha intentado actualizar a la versión 0.45?

@VietDucPhan Simplemente funcionó, totalmente al azar 😓. Todavía en 0.44.0

@rexlow Oh, bien por ti. Ahora, solo necesito mi suerte para golpearme.

¿Ha intentado simplemente eliminar la estructura de opciones? Eso es lo único que funcionó para mí.

Obtenga Outlook para iOS https://aka.ms/o0ukef


De: viet_duc_phan [email protected]
Enviado: domingo 18 de junio de 2017 11:26:15 p.m.
Para: facebook / react-native
Cc: Ujwal Setlur; Comentario
Asunto: Re: [facebook / react-native] La geolocalización 'enableHighAccuracy' en Android siempre se agota (# 7495)

@rexlow https://github.com/rexlow Oh, bien por ti. Ahora, solo necesito mi suerte para golpearme.

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-309349488 , o silencie el hilo https://github.com/notifications/unsubscribe-auth/ AFkMXYI2vukJgcTLkBeNdXdclgFbgo1sks5sFhSHgaJpZM4Ibete .

@rexlow @

¿Lo has probado en un dispositivo real?

El martes 20 de junio de 2017 a las 19:18 viet_duc_phan, [email protected] escribió:

@rexlow https://github.com/rexlow @ ujwal-setlur
https://github.com/ujwal-setlur Solo quiero que sepan que
la suerte me golpea. está funcionando y es totalmente aleatorio. yo no cambie
cualquier cosa.

-
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-309843462 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AACQ6OVyeCsOgd-qevP9CrP9XJMhwaxsks5sGAz3gaJpZM4Ibete
.

@raldred Siempre probado en dispositivos reales.

@VietDucPhan ¿ puede configurar un ejemplo que reproduzca el problema?

El martes 20 de junio de 2017 a las 20:52 viet_duc_phan, [email protected] escribió:

@raldred https://github.com/raldred Siempre probado en dispositivos reales.

-
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-309870269 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AACQ6N5SVbYeDEeY9FRnTQSrvpLwKL5aks5sGCLmgaJpZM4Ibete
.

@raldred, el informe original de esta cadena tiene un fragmento de código:

navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log(position);
       },
       (error) => {
        console.log(error)
      },
      {enableHighAccuracy: true, timeout: 20000, maximumAge: 10000}
);

También me falla a mí. La única forma de resolverlo parece no incluir el argumento de opciones:

navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log(position);
       },
       (error) => {
        console.log(error)
      }
);

@dreallday tiene razón, reaccionar nativo maneja mal la ubicación de Android. Sin embargo, en lugar de manejar manualmente los dos proveedores, sería mejor usar la API fusionada, que combina la información de los proveedores con magia.

Encontré react-native-fused-location realmente útil para realizar solicitudes de ubicación en Android.

@raldred Hola lo siento, no he

@ derman232 ¿ fused -location cuando la aplicación pase a segundo plano?

@rexlow lo siento, no sé la respuesta a eso, no es una característica que necesito para mi aplicación.

Solo dando mi opinión sobre cómo resolví este problema:

  • El problema es que android> = 6.0 requiere que se otorguen permisos durante el tiempo de ejecución
  • Esta pregunta de stackoverflow tiene más detalles: pregunta
  • Usé el módulo PermissionsAndroid de React Native para obtener los permisos

Ahora todo funciona.

Hola,
Nada funciona. Probé todo.
Por favor avise.
Gracias

Realmente me gustaría ayudar a resolver esto para la gente.
Tenemos 3 aplicaciones nativas de reacción que usan la ubicación en vivo. Realizó un control de calidad en más de 30 dispositivos Android reales que ejecutan Gingerbread hasta Nougat.
Todo funciona bien durante las pruebas de usuario, desde entonces no hemos tenido informes de problemas de usuarios en vivo.

@adriancuco, ¿ podría compartir su implementación y manifiesto para que podamos intentar ayudar más?

  • Versión de RN?
  • ¿Con qué versiones de Android tienes problemas?
  • ¿Con qué dispositivos tienes problemas?

Habrá una complejidad con su implementación o configuración de dispositivo, es una cuestión de averiguar qué es eso.

raldred,

Lo siento. ¡Mi culpa!
Antes de suicidarme, decidí verificar la configuración de ubicación en mi teléfono, como leí hace un par de días, y solo estaba habilitado el GPS. ; (
Entonces habilité GPS, Wifi, etc. y todo y ahora está funcionando bien.
Realmente lo aprecio.
Muchas gracias

¿Alguna actualización sobre este tema?

Todavía no hay solución.


De: adriancuco [email protected]
Enviado: martes 4 de julio de 2017 2:44:28 p.m.
Para: facebook / react-native
Cc: Marouen SAYARI; Comentario
Asunto: Re: [facebook / react-native] La geolocalización 'enableHighAccuracy' en Android siempre se agota (# 7495)

raldred,

Lo siento. ¡Mi culpa!
Antes de suicidarme, decidí verificar la configuración de ubicación en mi teléfono, como leí hace un par de días, y solo estaba habilitado el GPS. ; (
Entonces habilité GPS, Wifi, etc. y todo y ahora está funcionando bien.
Realmente lo aprecio.
Muchas gracias

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-312881724 , o silencie el hilo https://github.com/notifications/unsubscribe-auth/ AD79YGcm507EtBxrFHHJkEc-OBvRsjKmks5sKkG7gaJpZM4Ibete .

@ m-sayari vas a estar para darnos un poco más de información para ayudar.

  • Versión RN
  • Versión de destino de compilación de Android
  • Versión de dispositivo Android
  • Dispositivos en los que tiene este problema.

Serán algo específico de su implementación / configuración que causará el problema. Según mi anterior, lo tenemos funcionando sin problemas en múltiples aplicaciones en vivo.

¡Resuelto aquí! RN 0.45.1 usando un Redmi 4A con Android 6.

Tuve este problema al llamar navigator.geolocation.getCurrentPosition () dentro de componentDidMount ()
En lugar de getCurrentPosition, simplemente llame a watchPosition () con los mismos parámetros.

@raldred
Versión RN
0.46
Versión de destino de compilación de Android
api 22
Versión de dispositivo Android
6.0.1
Dispositivos en los que tiene este problema.
nexus 5

Llamar a getCurrentLocation sin el tercer parámetro 'opciones' resuelve mi problema. No me funciona que configurar 'enableHighAccuracy' como falso

Hola @raldred , el mismo problema que otros reportaron en RN 0.47.

  • Versión RN: 0.47
  • Versión de destino de compilación de Android que queda en los valores predeterminados de RN:
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
  • Versión del dispositivo Android: 6.0.1, 7.0
  • Dispositivos en los que tiene este problema:

    • Nexus 5 con Android 6.0.1

    • Xiaomi Redmi 3S con Android 6.0.1

    • Emulador de Android con Android 7.0

getCurrentPosition funciona bien cuando configuro el modo de ubicación "Solo dispositivo" en la configuración del dispositivo, pero deja de funcionar ( Location request timed out ) cuando el modo está configurado en "Alta precisión".

Necesito omitir el tercer parámetro para que getCurrentPosition funcione al menos en el modo Solo dispositivo:

    navigator.geolocation.getCurrentPosition(setLocation);

Supuse esto y funcionó para mí, aunque no lo he probado con un caso diferente.
Entonces, al ver mis opciones, descubrí que había dos elementos que entran en conflicto maximumAge y enableHighAccuracy , creo que estas dos opciones son iguales de una manera ligeramente diferente, mientras que la edad máxima te asegura obtenga la última geolocalización en función de su configuración, aunque la precisión es baja, enableHighAccuracy se asegura de que obtenga la ubicación más actual y precisa, estaba teniendo el mismo problema con las siguientes opciones.
{enableHighAccuracy: true, timeout: 20000, maximumAge: 60000} hasta que eliminé la edad máxima y me fui enableHighAccuracy espero que esto ayude a alguien.

Acabo de compilar react-native desde el maestro para probar si el compromiso 7e11bad86fd21ce1a8408218e66ce85993d9db69 soluciona este problema. Lamentablemente, sigo recibiendo el mismo error que antes.

La posición de

@olieidel Puede verificar si su aplicación tiene acceso a los permisos de ubicación con la siguiente API, PermissionsAndroid , primero debe verificar y luego preguntar si no se le otorga.

@mrbarde ¡ gracias por la rápida respuesta!

Ah, después de todo un día de depuración, aquí están mis hallazgos y una solución alternativa relevante:
RN 0.46.4, Dispositivo: Nexus 5X, API 25

Modo de ubicación: solo dispositivo

  • getCurrentPosition , enableHighAccuracy: true : funciona cuando la señal GPS está disponible, de lo contrario, se agota el tiempo de espera
  • getCurrentPosition , enableHighAccuracy: false : no funciona (tiempo de espera). probablemente necesite servicios de ubicación (¡modo de ubicación! = solo dispositivo).
  • watchPosition , enableHighAccuracy: true : funciona cuando la señal de GPS está disponible; de ​​lo contrario, se agota el tiempo de espera
  • watchPosition , enableHighAccuracy: false : no funciona

Modo de ubicación: alta precisión

  • getCurrentPosition , enableHighAccuracy: true : funciona cuando la señal GPS está disponible, de lo contrario, se agota el tiempo de espera. Puede devolver una ubicación anterior, dependiendo de su configuración de maximumAge .
  • getCurrentPosition , enableHighAccuracy: false : funciona después de 5-6 s (como ya se informó).
  • watchPosition , enableHighAccuracy: true : funciona cuando la señal de GPS está disponible; de ​​lo contrario, se agota el tiempo de espera
  • watchPosition , enableHighAccuracy: false : funciona

Resumen
Si su modo de ubicación es Solo dispositivo, debe esperar tener siempre una señal de GPS. En todos los demás casos, necesita servicios de ubicación (¡modo de ubicación! = Solo dispositivo).
Supongo que todo esto es el comportamiento esperado de la API de ubicación y acabo de descubrir que el equivalente a la tierra no es plana, sin embargo, esto es un infierno de depurar si tiene un dispositivo configurado con el modo de ubicación == Solo dispositivo (un emulador, un dispositivo recién configurado) y estás sentado en una habitación sin señal GPS disponible. En ese caso, solo obtendrá tiempos de espera.

Solución alterna
Como ya se describió en este hilo, también usé dos oyentes watchPosition con valores diferentes para enableHighAccuracy y simplemente tome el primer valor de ambos, luego elimínelos. Jugando con este enfoque, tuve la impresión de que ambos oyentes en realidad devuelven las mismas ubicaciones, pero mi tolerancia a la depuración del día está agotada ...
Esto supone que su modo de ubicación no es solo dispositivo.

@olieidel Seguro, y me pregunto por qué nadie usa la API de geolocalización nativa de reacción directamente. Si no es útil o simplemente no funciona, creo que lo apropiado sería reemplazarlo con navigator.geolocation ya que esto funciona maravillas, intente hacer una solicitud de extracción con su solución alternativa para ver si a Facebook le gusta. Y gracias por hacer un esfuerzo adicional para profundizar más.

Me tomó un tiempo reproducir este problema de manera consistente.

Tengo este problema solo en teléfonos Samsung con Android 5.1 y 6.0 cuando el modo de ubicación está configurado en "Alta precisión" y uso la API de posición actual mientras estoy en interiores sin señal de GPS. Funciona bien en teléfonos Oppo o en exteriores con una clara señal de GPS incluso con el modo "Alta precisión" activado.

Probaré algunas de las soluciones sugeridas en este hilo en breve.

@mrbarde solo para aclarar: estaba usando navigator.geolocation . :)

@olieidel Lo sé, solo digo que la documentación debe reflejar navigator.geolocation y no la Api de geolocalización.

Hola chicos, me di cuenta de que en Android, es posible que tenga permiso para acceder a la ubicación, pero el usuario ha desactivado la ubicación en la configuración del sistema operativo. Entonces, llamar a navigator.getCurrentPosition() aún se agotará.

Aquí hay un fragmento de código de Java con dos métodos. checkIfLocationAvailable que comprueba si el usuario tiene la ubicación activada en la configuración o no. requestUserToActivateLocation le pedirá al usuario que active la ubicación.

package location;

import android.Manifest;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.util.Log;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStates;
import com.google.android.gms.location.LocationSettingsStatusCodes;



/**
 * Created by nigelnindo on 11/28/16.
 */
public class LocationBridge extends ReactContextBaseJavaModule implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
    public LocationBridge(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    public GoogleApiClient googleApiClient;

    <strong i="10">@Override</strong>
    public String getName() {
        return "LocationBridge";
    }

    <strong i="11">@ReactMethod</strong>
    public void checkIfLocationAvailable(final Promise promise){

        int locationMode = 0;
        String locationProviders;
        boolean isAvailable = false;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            try {
                locationMode = Settings.Secure.getInt(getReactApplicationContext().getContentResolver(), Settings.Secure.LOCATION_MODE);
            } catch (Settings.SettingNotFoundException e) {
                e.printStackTrace();
            }

            isAvailable = (locationMode != Settings.Secure.LOCATION_MODE_OFF);
        } else {
            locationProviders = Settings.Secure.getString(getReactApplicationContext().getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
            isAvailable = !TextUtils.isEmpty(locationProviders);
        }

        boolean coarsePermissionCheck = (ContextCompat.checkSelfPermission(getReactApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED);
        boolean finePermissionCheck = (ContextCompat.checkSelfPermission(getReactApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);

        boolean finalResult = (isAvailable && (coarsePermissionCheck || finePermissionCheck));

        Log.e("FINAL RESULT", Boolean.toString(finalResult));

        promise.resolve(Boolean.toString(finalResult));

    }

    <strong i="12">@ReactMethod</strong>
    public void requestUserToActivateLocation(final Promise promise){

        Log.e("LOCATION_BRIDGE:", "called activate location function");

        if (googleApiClient == null) {
            Log.e("LOCATION_BRIDGE: ", "googleApiClient is null");
            googleApiClient = new GoogleApiClient.Builder(getReactApplicationContext())
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).build();
            googleApiClient.connect();
        }

        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        locationRequest.setInterval(30 * 1000);
        locationRequest.setFastestInterval(5 * 1000);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);

        //**************************
        builder.setAlwaysShow(true); //this is the key ingredient
        //**************************

        Log.e("LOCATION_BRIDGE", "Created builder");

        PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            <strong i="13">@Override</strong>
            public void onResult(LocationSettingsResult result) {
                Log.e("LOCATION_BRIDGE: ", "onResult callback invoked");
                final Status status = result.getStatus();
                final LocationSettingsStates state = result.getLocationSettingsStates();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        Log.e("LOCATION_BRIDGE: ", "Location settings satisfied");
                        // All location settings are satisfied. The client can initialize location
                        // requests here.
                        promise.resolve("true");
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        Log.e("LOCATION_BRIDGE", "Location resolution required");
                        // Location settings are not satisfied. But could be fixed by showing the user
                        // a dialog.
                        try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(
                                    getCurrentActivity(), 1000);
                            promise.resolve("awaiting");
                        } catch (IntentSender.SendIntentException e) {
                            Log.e("LOCATION_BRIDGE", "could not send intent");
                            promise.reject("LOCATION_BRIDGE", "could not send intent");
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        Log.e("LOCATION_BRIDGE", "location settings are unavailable");
                        // Location settings are not satisfied. However, we have no way to fix the
                        // settings so we won't show the dialog.
                        promise.reject("LOCATION_BRIDGE", "settings change is not available");
                        break;
                }
            }
        });

    }

    <strong i="14">@Override</strong>
    public void onConnected(<strong i="15">@Nullable</strong> Bundle bundle) {
        Log.e("LOCATION_BRIDGE", "CONNECTED");
    }

    <strong i="16">@Override</strong>
    public void onConnectionSuspended(int i) {
        Log.e("LOCATION_BRIDGE", "SUSPENDED");
    }

    <strong i="17">@Override</strong>
    public void onConnectionFailed(<strong i="18">@NonNull</strong> ConnectionResult connectionResult) {
        Log.e("LOCATION_BRIDGE", "CONNECTION FAILED");
        Log.e("LOCATION_BRIDGE", connectionResult.toString());
        if (connectionResult.hasResolution()){
            try {
                connectionResult.startResolutionForResult(getCurrentActivity(), 1);
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        }
        else{
            Log.e("LOCATION_BRIDGE","CONNECTION FAILURE HAS NO RESOLUTION");
        }
    }
}

Desde que comencé a usar esto, no he tenido problemas con la ubicación con Android. Con suerte, ayudará a alguien.

Por supuesto, deberá agregar compile 'com.google.android.gms:play-services-location:x.x.x' a su app/build.gradle y crear un módulo nativo como se describe aquí . No estoy seguro de si esta funcionalidad es suficiente para crear una biblioteca npm independiente.

Hola @nigelnindo , en realidad hay una API React Native para eso llamada PermissionsAndroid ,
puede verificar para asegurarse de que el usuario haya habilitado el permiso de ubicación para la aplicación
Tuve el mismo problema que usted señaló, así que lo que hice para resolverlo fue lo siguiente.

Primero verifiqué si el usuario le ha otorgado acceso a la aplicación a la ubicación de los dispositivos

PermissionsAndroid
.check("android.permission.ACCESS_FINE_LOCATION")
.then((granted) => {
    if(granted){
        // do something
        return;
    }
    // do something else
}).catch((err) => {
    // handle error
});

Y luego activó una función con el siguiente código, esto le pedirá al usuario que
otorgar acceso a la ubicación de la aplicación.

PermissionsAndroid
.request("android.permission.ACCESS_FINE_LOCATION")
.then((resp) => {
    if(resp == "granted"){
        _self._watchLocation();
    }else{
        this.props.watchLocSuccess();
    }
    // set state
    _self.setState({
        requestLocation: false
    });
    // 
}).then((err) => {
    // handle error
});

Esto funcionó para mí y ahora no tengo problemas de ubicación, espero que esto ayude a alguien.

Hola @mrbarde , solo para agregar, utilizo la biblioteca PermissionsAndroid además del fragmento de arriba. Como he mencionado antes:

Hola chicos, me di cuenta de que en Android, es posible que tenga permiso para acceder a la ubicación, pero el usuario ha desactivado la ubicación en la configuración del sistema operativo.

En otras palabras, su aplicación puede tener permiso para acceder a la ubicación obtenida con PermissionsAndroid , pero si el usuario desactivó la ubicación desde los accesos directos de la barra de estado o yendo a Settings -> Location -> Off the getCurrentPosition() call aún se agotará. Esto ayuda con ese caso de borde.

@nigelnindo yh en ese caso, entonces realmente sugeriré su solución, ¿es posible que haga un PR con esto? Quiero decir que realmente podría ahorrar mucho tiempo, uso un paquete externo para manejar esto ya que no puedo escribir Java, aunque realmente desearía tener el tiempo para aprenderlo. Si esto fuera oficialmente en React, preferiría eso, me pongo escéptico sobre confiar en bibliotecas de terceros para cosas realmente fundamentales como esta, me preocupa la coherencia.

intente cambiar (Android) TargetSdkVersion en build.gradle (aplicación) menor de 23 (16-22) . ¡y funcionará!

porque necesitamos permiso de uso del archivo AndroidManifest. y el archivo AndroidManifest solo se llama en SDK menores de 23 años (16-22).

y no olvides agregar:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

¡No elimine el parámetro maxAge!

Si lo hace, el módulo GPS devolverá el último resultado almacenado en caché hasta obtener la posición real de los satélites. Es posible que la posición esté almacenada en caché en otra aplicación que esté lejos de su posición real. Y si intenta guardar alguna pista, sus primeros puntos pueden mostrar una posición lejos de su posición real.

@pavelpashkovsky ¿Puede mostrar algunos hechos o documentos oficiales para respaldar su afirmación?

@rexlow Acabo de describir el resultado de mis pruebas, porque hace aproximadamente 1 semana me enfrenté con el mismo problema y encontré este tema.

Tuve unas 30 pruebas. Y obtuve 3-4 casos con la posición incorrecta los primeros 1-5 segundos (hasta que el GPS encontró la señal de los satélites)

@pavelpashkovsky Ahora también estoy enfrentando el mismo problema. Aunque tengo maximumAge: 1000 en mi configuración. Parece que está almacenando en caché la ubicación anterior como dijiste.

@rexlow Tienes razón. En su caso, el GPS mantiene la posición durante 1 segundo.

Pero el mejor resultado que obtuve con maximumAge: 0 cuando gps no guarda ningún resultado y siempre intenta obtener la posición real (o error si no puede obtener la posición de los satélites).

Puedo confirmar que eliminar el máximo daño puede causar problemas en el teléfono Oppo que también probé. Utilizará caché muy antiguo.

Me estaba pasando todo el tiempo. Resulta que mi permiso de geolocalización se desactivó en Información de la aplicación -> Permisos. Me pregunto por qué sucedió eso, pero parece que esos permisos anulan los que solicitamos en tiempo de ejecución. Quizás alguien más tenga este problema también

hola (perdón por mi inglés).
Creo que aumentar la edad máxima resolverá el problema.

RN 0.48 Documento de geolocalización:
La API de geolocalización amplía la especificación web: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation

y según:
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy
Y
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/timeout
y especialmente :
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/maximumAge

en un escenario con estas opciones:
{enableHighAccuracy: true, timeout: 10000, maximumAge: 30000}

El chip GPS del dispositivo intenta conectarse a los satélites. si la conexión se estableció en el período de tiempo de espera (10000 ms), la latitud y la longitud se devolverán sin ningún error como dijo @RoBYCoNTe : problemacomment-220580494 pero si la conexión GPS falla o se agota el tiempo, el dispositivo intenta devolver una latitud y longitud en caché con la edad máxima que se establece opciones (30000 ms). si algo existe, se devolverá, de lo contrario, se devolverá el código de error 3 con un error de tiempo de espera en el asunto.

Creo que aumentar el tiempo de espera (al menos 25000 ms) para la conexión y, especialmente, aumentar la edad máxima (al menos 3600000 ms = 1 hora) es la mejor solución.

{enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000} funcionó para mí

_emulator config_: durante el período de tiempo de espera, debe enviar información de ubicación virtual (latitud y longitud) a través del menú Ubicación en la configuración del emulador. (esto emulará la conexión por satélite)

{ enableHighAccuracy: true, timeout: 60000, maximumAge: 1200 } funcionó para mí. Para mí, no se trataba de la edad máxima, sino del tiempo que estaba dispuesto a esperar.

(Solo Android)
Este problema no es un error en mi opinión.
En React Native, la geolocalización funciona de la siguiente manera:

  • highAccuracy significa ubicación GPS
  • Cuando está deshabilitado, obtiene la ubicación del proveedor de red
  • maximumAge le permite no buscar una nueva posición cada vez (que consume batería y tiempo) sino que confía en una posición en caché

Básicamente, el proveedor de GPS es más lento que el proveedor de red y no siempre funcionará dependiendo de su ubicación (si el GPS no puede alcanzar el teléfono, obtendrá un tiempo de espera). El proveedor de red es más rápido, más accesible, pero como compensación, la precisión es baja (lo peor que tuve fueron 2000 metros).

Si tiene un tiempo de espera usando highAccuracy, significa que no puede ser localizado por GPS.
En este caso, considere deshabilitarlo de forma predeterminada y actualice la ubicación a medida que se vuelva más y más precisa. Sus usuarios no esperarán en este caso.

En mi caso implementé mis propios observadores, comparando ubicación y siempre devolviendo los más precisos. El problema con la implementación de RN predeterminada es que se basa en el proveedor de GPS o en el proveedor de red, pero no devuelve una compensación de ambos. Probablemente tendrá que resolverlo en JS o Native.

Espero que haya ayudado.

Probado solo en Android.

Me las arreglé para que funcione con los siguientes casos y me aseguro de que la ubicación esté habilitada:

  • Si está ejecutando su aplicación a través de Android Emulator, debe poner opciones o fallará.
navigator.geolocation.getCurrentPosition(
    (position) => {
        this.setState({currentLocation: {lat: position.coords.latitude, lng: position.coords.longitude}})
    }, (error) => {
        alert("Geolocation error: "+error.message);
    },
    {enableHighAccuracy: true, timeout: 20000, maximumAge: 0}
);

Solo uso controles extendidos para enviar mi ubicación deseada a la aplicación.

  • Si está ejecutando su aplicación a través de teléfonos móviles reales, debe omitir las opciones o fallará.
navigator.geolocation.getCurrentPosition(
    (position) => {
        this.setState({currentLocation: {lat: position.coords.latitude, lng: position.coords.longitude}})
    }, (error) => {
        alert("Geolocation error: "+error.message);
    }
);

Esto obtendrá su ubicación actual

¡Estamos experimentando el mismo problema!

¿Hay una solución para esto en alguna versión futura cercana?

Probé algunas de las soluciones propuestas ( ejemplo , ejemplo , ejemplo y ejemplo ) y ninguna de ellas resolvió el problema. Pero debo decir que no encontré ninguna referencia para el siguiente escenario:

Aplicación

  • Android 6.x
  • Reaccionar 16.1.0
  • React-Native 16.50.3

Escenario de uso

  • El teléfono Android no tiene tarjeta SIM, son propiedad de la empresa y solo se les permite conectarse a la red WIFI.

Sigo recibiendo el error Geolocation timed out, code 3 ...

¿Alguien resolvió esto?

_Actualización_ (13/11/2017):

Lo resolví (al menos temporalmente) configurando Settings >> Privacy >> Location >> Mode en High accuracy

Hola.
¡Encontré una buena solución!
Lea primero mi comentario anterior sobre este problema: # issuecomment-331830285

Solución:
Primero llame navigator.geolocation.getCurrentPosition con: {enableHighAccuracy: true, timeout: 60000, maximumAge: 0} como PositionOptions , esto devolverá la posición actual real.
Si se agotó el tiempo de espera de la solicitud anterior, llame a navigator.geolocation.getCurrentPosition con: {enableHighAccuracy: false, timeout: 30000, maximumAge: 3600000} como PositionOptions , esto devolverá la posición LowAccuracy como una reserva y _ (creo) _ ¡nunca se agotó el tiempo!
Código de muestra:

const GeoHightAccuracy = () => {
  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(
      (locHightAccuracy)=>{
        resolve(locHightAccuracy)
      },
      (error)=>{
        GeoLowAccuracy()
        .then((locLowAccuracy)=>{resolve(locLowAccuracy)})
        .catch((err)=>{reject(err)});
      },
      {enableHighAccuracy: true, timeout: 60000, maximumAge: 0}
    )
  });
};
const GeoLowAccuracy = () => {
  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(
      (locLowAccuracy)=>{
        resolve(locLowAccuracy)
      },
      (error)=>{
        reject(error)
      },
      {enableHighAccuracy: false, timeout: 15000, maximumAge: 3600000}
    )
  });
};



md5-4cb745c8e66bae2435e8bf78ce42a9c0



GeoHightAccuracy()
.then(locationData => console.log(locationData))
.catch(error => console.log(error));

Espero ser útil.

¡Estoy teniendo el mismo problema aquí!
No puedo conseguir que navigator.geolocation funcione en mi dispositivo Android real.

Creo que no hay nada que arreglar aquí, la geolocalización está funcionando como se esperaba. Lea mi publicación de arriba.

@Rewieer , ¡Gracias por tu respuesta!

Estoy usando este código para probar navigator.geolocation en mi aplicación.

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 5000
};

function success(pos) {
  var crd = pos.coords;
  alert(crd.latitude + " " + crd.longitude);
};

function error(err) {
  alert('ERROR(' + err.code + '): ' + err.message);
};

navigator.geolocation.getCurrentPosition(success, error, options);

Siempre obtengo ERROR(3): Location request timed out .
utilizando todas las combinaciones de opciones.
Puedo ver el punto azul de mi posición en el mapa y el GPS funciona bien, pero no puedo obtener la posición o hacer que navigator.geolocation funcione programáticamente.

Los posibles problemas son:

  • mala configuración del simulador / teléfono
  • no en un área cubierta por GPS (funciona mal en edificios o en calles con edificios grandes, por ejemplo)
  • tiempos de espera demasiado pronto

El uso de la ubicación de red parece funcionar mejor en este caso. ¿Intentaste recuperar la posición actual sin opciones? (que usaría infraestructura relacionada con la red para obtener el puesto)

Estoy usando un dispositivo Android real (versión 5.1)
Puedo determinar mi posición usando react-native-maps (posición correcta del punto azul en el mapa dentro de mi aplicación) + Puedo usar la aplicación Google Maps e ir a mi posición (el GPS funciona).
Estoy usando un gran tiempo de espera, alternando enableHighAccuracy a verdadero y falso, eliminar opciones ... etc. no todos pudieron obtener navigator.geolocation para obtener datos.

¿Te ensuciaste las manos con Android con la API nativa?

2017-11-16 15:19 GMT + 01: 00 Badis Merabet [email protected] :

Estoy usando un dispositivo Android real (versión 5.1)
Puedo determinar mi posición usando react-native-maps (azul correcto
posición del punto en el mapa dentro de mi aplicación) + Puedo usar la aplicación de mapas de Google y
ir a mi posición (GPS funciona).
Estoy usando un gran tiempo de espera, cambiando enableHighAccuracy a verdadero y falso,
eliminar opciones ... etc. no todos pudieron obtener navigator.geolocation para obtener
datos.

-
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-344935653 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ALuPm5XL1tNLCniOMR4YAMI4ZC2fKxrsks5s3ESBgaJpZM4Ibete
.

@Rewieer , estoy de acuerdo, la causa de los errores son las malas configuraciones.

En el emulador, debemos enviar la latitud y la longitud a través de la configuración del emulador antes del tiempo de espera.

Mi solución # issuecomment-331830285 primero intenta obtener la posición actual real a través de GPS y conexión satelital y, si la solicitud se agota (o en cualquier otro error) intenta usar la infraestructura relacionada con la red para obtener la posición LowAccuracy .

@Rewieer Nunca trabajé con la API nativa de Android. Solo estoy desarrollando JavaScript.

@badis , envíe su código y registro de errores.

@badis
RN Doc:
Para solicitar acceso a la ubicación, debe agregar la siguiente línea al archivo AndroidManifest.xml de su aplicación:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Al trabajar con react-native, debe conocer algunas cosas sobre el entorno nativo subyacente, porque este tipo de problemas me suceden bastante al trabajar con React-Native.
La mejor manera real (en lo que respecta al usuario) es obtener una aproximación al inicio y corregirla a medida que avanza, porque el GPS puede llevar algo de tiempo según su posición y la posición de los satélites cercanos. Sé que la ubicación de la red puede parecer muy difícil, pero supongo que no todos viven en San Francisco :)

@Rewieer @hoorsa
Aquí hay un código de demostración donde realizo pruebas de funciones: https://github.com/badis/mobile-react-native
Eche un vistazo a la página Mapa.
Solo quiero saber si el código es correcto y funciona para otra persona.
Después de eso, intentaré de mi lado para ver si el problema está en la configuración y ubicación de mi dispositivo.

Gracias a todos !

@badis, ¿ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> al archivo AndroidManifest.xml de tu aplicación?

@badis Tuve el mismo problema ayer. Funciona si simplemente elimina el último argumento (entiendo que no es ideal) como se sugiere en https://github.com/facebook/react-native/issues/7495#issuecomment -228730196

¿Cuáles son las opciones predeterminadas para Android? tal vez eso podría ayudar a resolver este

Creo que usamos estos valores predeterminados (de inspeccionar LocationModule.java):

{
enableHighAccuracy: false, // No use GPS
maximumAge: Double.POSITIVE_INFINITY, // Acepta cualquier ubicación en caché
tiempo de espera: Long.MAX_VALUE,
distanciaFiltro: 100
}

También estamos experimentando el mismo error de ubicación, la desactivación del tercer parámetro de opción funciona para los modos 'Alta precisión' y 'Ahorro de batería'. Sin embargo, el dispositivo solo falla cada vez. enableHighAccuracy en true falla independientemente del modo en el que configuramos el dispositivo.

¿Es esto incluso utilizando FusedLocationProviderClient , como sugiere el sitio de desarrollo de Android?

La desactivación del tercer parámetro de opción funciona para los modos 'Alta precisión' y 'Ahorro de batería'.

@mkpietrzyk, ¿ así que omitir options resolvió en estos dos modos?

@natterstefan

sí, para Android utilicé parámetros predeterminados ... pero tener un tiempo de espera casi infinito y una edad máxima para mi aplicación es un poco un asesino de aplicaciones, ya que necesito saber dónde están mis usuarios para verificar algunas condiciones.

usando la solución @hoorsa aquí, la verificación de gps también funciona. Sin embargo, es muy complicado para gps de todos modos y, a veces, no responde con alta precisión ... es por eso que no considero que funcione tan bien, pero bueno, funciona un poco.

Tengo el mismo problema, donde necesito establecer el tiempo de espera para que sea una cantidad de tiempo ridículamente alta para que funcione, pero los usuarios deberán acceder a la información antes. Al crear la aplicación por primera vez, puedo registrar en medio segundo que los permisos para acceder a la ubicación fina son válidos. La implementación de una buena ubicación simplemente no funciona correctamente en Android.
Como referencia, lo he probado con / sin parámetros. Incluso sin opciones adicionales, a veces no se cargará la ubicación. La prueba se realizó en un One Plus One

También tengo este problema de tiempo de espera.

RN .50.3

Intentado, llamando a la API con y sin el parámetro maximumAge:

{enableHighAccuracy: true, timeout: 10000},

También estoy cerrando esta llamada con una solicitud de permiso para que no sea un problema:

PermissionsAndroid.request (
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,

El modo de alta precisión está habilitado en el dispositivo.
Manifest tiene los permisos correctos.

En mi Galaxy S7, resuelve bien una ubicación.
En mi Pixel 2, se agota después del tiempo de espera de 10 segundos en una ubicación que no tiene señal GPS.
En el emulador: se agota después del tiempo de espera de 10 segundos A MENOS QUE vaya a la pestaña de ubicación en los controles expandidos y haga clic en ENVIAR para enviar una ubicación.

Parece que navigator.geolocation.getCurrentPosition NO funciona cuando no hay señal de GPS, incluso si hay una ubicación anterior almacenada en caché de otra aplicación que había utilizado la ubicación anteriormente.

Voy a solucionar esto probando una alta precisión, luego lo ha hecho

Tengo el mismo problema que @jacksontbryan, pero getCurrentPosition ¿El uso de una ubicación en caché si maximumAge se omite.

Parece funcionar bien en un Galaxy S7, pero no en mi LG G6. En LG, se agota casi todas las veces, si se establece la edad máxima. Si no se establece maximumAge, utiliza una ubicación antigua.

Editar: Parece que omitir el argumento de opciones funciona por completo.

Recomiendo a todos que utilicen la propia implementación del módulo nativo en Android para obtener resultados estables. Es bastante fácil de implementar, obtendrá mucho más control sobre el GPS y no tendrá que preocuparse de que su aplicación no funcione en algunos dispositivos.

    public Location getBestLastKnownPosition(Context context) {
        LocationManager locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
        List<String> providers = locationManager.getProviders(true);
        Location bestLocation = null;
        for (String provider : providers) {
            Location l = locationManager.getLastKnownLocation(provider);
            if (l == null) {
                continue;
            }
            if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
                // Found best last known location: %s", l);
                bestLocation = l;
            }
        }

        if (bestLocation == null) {
            locationManager.requestSingleUpdate(new Criteria(), this, null);
        }
        return bestLocation;
    }

    private static WritableMap locationToMap(Location location) {
        WritableMap map = Arguments.createMap();
        WritableMap coords = Arguments.createMap();
        coords.putDouble("latitude", location.getLatitude());
        coords.putDouble("longitude", location.getLongitude());
        coords.putDouble("altitude", location.getAltitude());
        coords.putDouble("accuracy", location.getAccuracy());
        coords.putDouble("heading", location.getBearing());
        coords.putDouble("speed", location.getSpeed());
        map.putMap("coords", coords);
        map.putDouble("timestamp", location.getTime());
        map.putString("provider", location.getProvider());

        if (android.os.Build.VERSION.SDK_INT >= 18) {
            map.putBoolean("mocked", location.isFromMockProvider());
        }

        return map;
    }

    <strong i="6">@ReactMethod</strong>
    public void getCurrentPosition(Callback successCallback, Callback errorCallback){
        Location l = getBestLastKnownPosition(this.getReactApplicationContext());
        if (l == null){
            errorCallback.invoke("Failed to retrieve current location");
            return;
        }
        successCallback.invoke(locationToMap(l));
    }

    private static class LocationOptions {
        private final long timeout;
        private final double maximumAge;
        private final boolean highAccuracy;
        private final float distanceFilter;

        private LocationOptions(
                long timeout,
                double maximumAge,
                boolean highAccuracy,
                float distanceFilter) {
            this.timeout = timeout;
            this.maximumAge = maximumAge;
            this.highAccuracy = highAccuracy;
            this.distanceFilter = distanceFilter;
        }

        private static LocationOptions fromReactMap(ReadableMap map) {
            // precision might be dropped on timeout (double -> int conversion), but that's OK
            long timeout =
                    map.hasKey("timeout") ? (long) map.getDouble("timeout") : Long.MAX_VALUE;
            double maximumAge =
                    map.hasKey("maximumAge") ? map.getDouble("maximumAge") : Double.POSITIVE_INFINITY;
            boolean highAccuracy =
                    map.hasKey("enableHighAccuracy") && map.getBoolean("enableHighAccuracy");
            float distanceFilter = map.hasKey("distanceFilter") ?
                    (float) map.getDouble("distanceFilter") :
                    10;

            return new LocationOptions(timeout, maximumAge, highAccuracy, distanceFilter);
        }
    }

    <strong i="7">@ReactMethod</strong>
    public void watchPosition(ReadableMap options, Callback successCallback, Callback errorCallback){
        LocationOptions opts = LocationOptions.fromReactMap(options);
        LocationManager locationManager = (LocationManager)this.getReactApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        if (opts.highAccuracy) {
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
        }
        String bestProvider = locationManager.getBestProvider(criteria, true);

        locationManager.requestLocationUpdates(bestProvider, 1000, opts.distanceFilter, this);
    }

    <strong i="8">@Override</strong>
    public void onLocationChanged(Location location) {
        if (location == null) return;

        this.getReactApplicationContext()
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("locationChanged", locationToMap(location));
    }

@Buthrakaur Estoy tratando de crear un módulo nativo para su fragmento, pero no puedo hacerlo funcionar porque falló en la compilación. He publicado mi esencia https://gist.github.com/pewh/1fd64c8f0b3797ef2b7a7046b5a5f974 y espero que alguien tenga la amabilidad de hacer una revisión de mi esencia. ¡Muchas gracias y feliz navidad!

Llamar a navigator.geolocation.getCurrentPosition sin ninguna opción me resolvió el problema. Solo estoy pasando devoluciones de llamada de éxito y error.

Probado en un dispositivo real con Android 5.1.

@ginex ¿Estás seguro de que los datos son nuevos? Cuando hago eso, a veces obtengo datos de hace una hora. (Dice que estoy donde estaba hace una hora).

¡Esto realmente necesita ser arreglado!

Hola

También me enfrento al mismo problema. Recibo un error de tiempo de espera en algunos de los dispositivos. He aumentado el tiempo de espera de 2 segundos a 10 minutos, pero sin esperar 10 minutos, simplemente me arroja el error.

También probé con enableHighAccuracy: false. En este caso, puedo obtener la ubicación (excepto en el modo de dispositivo).

También lo he intentado sin pasar los parámetros. También puedo obtener la ubicación en este caso, pero excepto en el modo de dispositivo.

También he intentado pasar maximumAge pero sin resultado.
Este es mi código

getCurrentPosition () {
navigator.geolocation.getCurrentPosition (
(posición) => {
console.log ('obtener posición');
this.location = {
longitude: position.coords.longitude,
latitude: position.coords.latitude,
error: nulo,
};
},
(error) => {
console.log ('obtener error de posición', error);
this.location = {
longitud: nulo,
latitud: nula,
error: error.message,
};
},
{
enableHighAccuracy: true,
tiempo de espera: 600000
},
);
}

Si alguno de ustedes está usando skipPermissionsRequest y geoLocation se agota el tiempo - vea # 17487

Hola

@ngandhy - No, no estoy usando 'skipPermissionRequests': true. y minSdkVersion es 16

Tengo los mismos problemas que todos ustedes, probé todas las combinaciones que mencionan las personas para Android y las resuelvo con esta geolocalización de fondo nativo de reacción y podemos obtener ubicaciones guardadas e incluso ubicaciones de GPS y estas ubicaciones serán muy precisas.

@badis
Su solución funcionó para mí, ¡gracias!

Mi método antes de arreglar:

getUserLocationHandler() { navigator.geolocation.getCurrentPosition(position => { console.log(position.coords.latitude, position.coords.longitude); }, err => { console.log(err); } }

Mi método después de tu solución:

getUserLocationHandler() { navigator.geolocation.getCurrentPosition(position => { console.log(position.coords.latitude, position.coords.longitude); }, err => { console.log(err); }, {enableHighAccuracy: false, timeout: 15000, maximumAge: 3600000}); }

Solo pruebo este código y podría ser una solución:
https://www.abidibo.net/blog/2017/11/23/geolocation-react-native/

¿Tiene este problema también, alguien tiene una solución?

He estado experimentando este problema durante un tiempo y la única "solución" que funciona de manera constante es deshabilitar "enableHighAccuracy". El problema con esto es que luego usa su red en lugar de GPS para determinar su ubicación, lo que pierde mucha precisión.

Muchas de las otras soluciones parecen funcionar al principio, pero descubrí que generalmente se debe al uso de una posición almacenada en caché y, si reinicia su teléfono e inicia su aplicación, aún fallará.

Hoy, encontré este paquete que usa la API de ubicaciones fusionadas de Google para ubicaciones de Android y recurre a la implementación predeterminada de React Native para iOS (no soy el autor de este paquete, pero felicitaciones a él por crearlo):

https://www.npmjs.com/package/react-native-geolocation-service

Solo lo he probado un poco hasta ahora, pero parece que funciona bien.

@globetro ¡Gracias! También comprobé esto, ¡y parece que funciona bien!

@globetro Gracias.
react-native-geolocation-service es la mejor solución.

@globetro También tuve éxito con este complemento. ¡Esto debería combinarse con react-native como la funcionalidad de geolocalización predeterminada!

react-native-geolocation-service no me ayuda :(

Gracias @globetro, el paquete * react-native-geolocation-service * funcionó a la perfección, sería bueno agregar esto como componente central en react native.

Realmente desea tener dos detectores de ubicación (lo cual es caro), uno que tenga alta precisión y otro que no.

entonces desea comparar cuál es más precisa y más nueva que su ubicación "actual".


Esta es una solución 'temporal', esto realmente debería implementarse en el lado de RN, por lo que usa permisos COARSE y FINE si está habilitado highAccuracy.

Solucioné este problema, aquí está el componente que creé usando una promesa:
https://gist.github.com/a3diti/5466f7309752cbb2e63ecefff6365bb9
En Android eliminé maximumAge , guardé enableHighAccuracy en true y agregué una verificación de permiso del componente RN PermissionsAndroid .

@ a3diti ¿Lo ha probado en el mundo real? La ubicación podría almacenarse en caché.

@ a3diti A menos que hayan arreglado algo en la última versión de react-native, eso no funcionará en todo momento en Android. Intente iniciarlo en un dispositivo Android real después de reiniciar. Es probable que se necesiten más de 20 segundos para obtener una actualización de posición, si no solo el tiempo de espera.

¿Por qué no fusionar el código utilizado aquí https://www.npmjs.com/package/react-native-geolocation-service en el núcleo?

Me enfrento al mismo "problema de tiempo de espera de solicitud", después de I + D, trato de "reiniciar" el dispositivo y luego de obtener la ubicación y funciona bien.

Por favor revisa mi código.

componenteDidMount = () => {
navigator.geolocation.getCurrentPosition (
(posición) => {
const initialPosition = JSON.stringify (posición);
this.setState ({posicióninicial});
},
(error) => alerta (error.message),
{enableHighAccuracy: false, timeout: 20000, maximumAge: 1000, distanceFilter: 1}

  );
  this.watchID = navigator.geolocation.watchPosition((position) => {
     const lastPosition = JSON.stringify(position);
     this.setState({ lastPosition });
     Alert.alert("Location change",lastPosition);

  });

}

Cualquier motivo por el que la gente todavía esté luchando con esto y no use

https://www.npmjs.com/package/react-native-geolocation-service

como se sugirió anteriormente? Funciona perfectamente para mí.

¿No está funcionando para otros?

Se agregó esto al archivo AndroidManifest.xml y ¡funciona!

  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Hola chicos,

Intenté usar react-native- geolocation -service como lo sugirió @globetro pero hace que mi aplicación se bloquee instantáneamente. ¿Algunas ideas?

@ Patrick-Bayer Lo estoy usando en mi aplicación en Google Play donde funciona, pero mi versión de desarrollo ahora se bloquea instantáneamente por una razón desconocida. Parece ser react-native-geolocation-service lo que también me está causando el bloqueo.

Fatal Exception: java.lang.VerifyError: Verifier rejected class com.google.android.gms.location.FusedLocationProviderClient: void com.google.android.gms.location.FusedLocationProviderClient.<init>(android.app.Activity) failed to verify: void com.google.android.gms.location.FusedLocationProviderClient.<init>(android.app.Activity): [0x8] register v2 has type Precise Reference: com.google.android.gms.common.api.internal.zzg but expected Precise Reference: com.google.android.gms.common.api.internal.zzcz

Déjeme saber si usted encuentra una solución.

@oakis Los siguientes pasos funcionaron para mí:

  1. Actualiza Gradle y cambia la versión en
dependencies {
        classpath 'com.android.tools.build:gradle:3.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

  1. Agregue "google ()" a los repositorios en su android / build.gradle

A veces, incluso después de agregar <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> a su AndroidManifest.xml, es posible que aún no funcione.
Solución rápida

  1. Podría solicitar explícitamente la información de ubicación del usuario cuando monte la primera pantalla de su aplicación así
    try { const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION ) if (granted == PermissionsAndroid.RESULTS.GRANTED) { // WHATEVER WAY YOU WANT THEM TO KNOW THAT THEY HAVE GRANTED THE PERMISSION //MAY BE USING BASIC ALERT OR TOASTANDROID } else { //SAME AS ABOVE } } catch (error) { //catch the error alert(error); }
  2. Nunca establezca enableHighAccuracy como falso, en su lugar elimine maximumAge y aumente su timeOut . Algo como {enableHighAccuracy: true, timeout: 100000,} bastaría.

Espero que esto ayude a alguien.

Para mí, establecer enableHighAccuracy en true funciona en API 23, aunque necesito establecerlo en false en API 26.
(son los únicos en los que estoy probando)

EDITAR: Terminé instalando react-native-geolocation-service y eso resolvió mis problemas 🥁

Hola,

Tuve el mismo problema y aquí hay otra solución.

Agregué la siguiente etiqueta uses-feature en AndroidManifest.xml y parece que la aplicación funciona bien con highAccuracy: true

<uses-feature android:name="android.hardware.location.gps" />

Parece que si establece highAccuracy: high , React Native usa GPS_PROVIDER en lugar de NETWORK_PROVIDER. Y como dice el documento de desarrolladores de Android, una aplicación dirigida a API 21 o superior debe incluir esta etiqueta en AndroidManifest.xml para usar GPS_PROVIDER.

Precaución: si su aplicación apunta a Android 5.0 (API nivel 21) o superior, debe declarar que su aplicación usa la función de hardware android.hardware.location.network o android.hardware.location.gps en el archivo de manifiesto, dependiendo de si su la aplicación recibe actualizaciones de ubicación de NETWORK_PROVIDER o de GPS_PROVIDER. Si su aplicación recibe información de ubicación de cualquiera de estas fuentes de proveedores de ubicación, debe declarar que la aplicación utiliza estas funciones de hardware en el manifiesto de su aplicación. En dispositivos que ejecutan versiones anteriores a Android 5.0 (API 21), solicitar el permiso ACCESS_FINE_LOCATION o ACCESS_COARSE_LOCATION incluye una solicitud implícita de funciones de hardware de ubicación. Sin embargo, solicitar esos permisos no solicita automáticamente funciones de hardware de ubicación en Android 5.0 (API nivel 21) y versiones posteriores.

https://developer.android.com/guide/topics/location/strategies#Permission

No sé por qué no necesita incluir android.hardware.location.network en AndroidManifest.xml al configurar highAccuracy: false que implica que LocationManager usa NETWORK_PROVIDER y, por lo tanto, la etiqueta se requiere de acuerdo con el documento.

Espero que esta solución funcione para ti.

Hice algunos experimentos y parece que el tiempo de espera podría tener que ver con si los servicios de ubicación de Google están habilitados en el dispositivo.
Noté que cuando enciendo los servicios de ubicación en el dispositivo, un cuadro de alerta le pregunta "¿Mejorar la precisión de la ubicación?" con un texto que explica que los servicios de ubicación de Google se ejecutarán en segundo plano y también enviarán datos de ubicación a Google. Esto suele ocurrir en un nuevo dispositivo o emulador, porque la mayoría de nosotros ya lo hemos habilitado en nuestros dispositivos habituales.

9vgfb

Cuando esto no está habilitado, el dispositivo tiene que obtener una ubicación nueva casi cada vez que la solicite (controlado por la configuración maximumAge ). Si no ha solicitado la ubicación durante un tiempo, y el timeout no es suficiente para obtener una ubicación nueva, navigator.geolocation.getCurrentPosition simplemente devolverá un tiempo de espera.

También he visto que esto se resuelve al abrir Google Maps en el dispositivo una vez (que nuevamente obtiene una nueva ubicación).

Nuevamente, sin afirmar que esta sea la explicación / solución correcta, solo agrego mis observaciones a este hilo

Solo pude ver los cambios de ubicación en Android con react-native-fused-location

¿Alguien interesado en incorporar los cambios de uno de los módulos sugeridos al núcleo?

Hace unos días publiqué react-native-cross-geolocation que es compatible con el módulo de geolocalización RN, pero utiliza la API de ubicación de Google más eficiente para Android. Por eso no creo que mi módulo sea candidato para integrarlo en el núcleo de RN, pero está disponible para cualquiera que quiera usarlo.

react-native-geolocation-service Este paquete usa una api de ubicación fusionada y funciona bien para obtener la posición o incluso para observar la posición. @hramos y @reyalpsirc por favor pruébalo.

La ubicación fusionada de

Probé casi todo y resulta que es inconsistente. Encontré algo que podría ser útil.

Permitir una alta precisión significa encontrar la ubicación a través de la red gps + (servicios de operador). Al verificar los permisos de nivel de la aplicación, mi dispositivo tenía los permisos de ubicación de los servicios del operador deshabilitados. Habilitarlo y eliminar el tercer parámetro de navigator.geolocation.getCurrentPosition () funciona para mí.
Tratar
-Vaya a Configuración de su dispositivo -> Seguridad y ubicación -> Ubicación -> Permisos de nivel de aplicación
-Habilitar el permiso de ubicación para los servicios del operador
-Eliminar la configuración de ubicación (tercer parámetro) de getCurrentPosition
-Reinicia tu dispositivo

¡Espero que esto ayude!

No estoy seguro de si es relevante. Pero un ejemplo de https://snack.expo.io/SkJqg8gYm. Después de personalizar el código, el código golpea el bloque de captura todo el tiempo. Luego descubrí que cada vez que se produce una excepción de JavaScript, se lanza silenciosamente. Debido a este bloque de captura se ejecutó. Luego me aseguré de que no ocurriera ningún error al llamar a esa función. Supongo que el mecanografiado debería aplicarse en casos como este para evitar errores en tiempo de ejecución.

{enableHighAccuracy: true, timeout: 10000, maximumAge: 0}
lo que encontré si omito el segundo parámetro o dando menos de 10000 valores, da el error

tratar de dar los tres parámetros como arriba resolverá mi problema al menos en el emulador

Intente agregar estos permisos en su _AndroidManifest.xml_ :

<_usa-permiso i = "6" />
<_usa-permiso i = "8" />
<_permission_ i = "10" /> _android: name = "android.permission.ACCESS_COARSE_LOCATION" _
_android: protectionLevel = "firma" _ />
<_permission_ i = "13" /> _android: name = "android.permission.ACCESS_FINE_LOCATION" _
_android: protectionLevel = "firma" _ />

Hola, me estaba enfrentando al mismo problema "tiempo de espera de solicitud". He intentado todas las soluciones posibles, como se indica anteriormente, pero no me han funcionado, pero recientemente encontré un módulo que soluciona este problema.
https://www.npmjs.com/package/react-native-geolocation-service
Esto funcionó para mí ...

@vishalTechnoFreek , también existe react-native-cross-geolocation .

Es totalmente compatible con la geolocalización actual de RN, pero utilizando la nueva API de Google. Con esta API no te preocupes por qué modo usar, el servicio detecta automáticamente la mejor opción.

Otra ventaja es que, cuando RN corrige este problema, puede eliminarlo sin afectar su aplicación, si lo desea.

En mi caso, lo que mencionó @manurana sobre (descargar y) abrir la aplicación Google Maps y luego volver a la Expo funcionó.

Estoy trabajando con Genymotion y Android 5.

Además, para los usuarios de Genymotion, para leer correctamente la posición, la ventana del mapa de Genymotion debe estar abierta; de lo contrario, funcionará pero con la ubicación predeterminada de Geny

establecer enableHighAccuracy en true o false no funciona para mí.
omitir el tercer argumento para getCurrentPosition para usar los valores predeterminados del módulo nativo funciona para mí.

salvavidas 👍 esto funcionó para mí.

Yo chicos
Estaba enfrentando el mismo error pero, después de algunos reintentos con mis colegas, notamos algo extraño (pero normal si lo que te gusta es el GPS).

Si ejecuta pruebas "dentro de su oficina" utilizando un dispositivo físico, el localizador GPS puede verse afectado por elementos externos como paredes, o por el simple motivo de que está intentando realizar esta operación "en interiores" y, en general, esto debe realizarse en exteriores. .

Bueno, después de esto salimos de nuestra oficina, volvemos a ejecutar las pruebas y el dispositivo responde según lo planeado (no recibimos el error de Solicitud agotada).

Mi sugerencia es: pruebe la geolocalización usando "enableHighAccuracy" establecido en verdadero, si esto falla (en la oficina esto puede fallar), vuelva a intentarlo con falso, esto debería funcionar, en mi caso lo hizo.

Espero que esto pueda ayudar.

Estoy enfrentando el mismo problema, pero configurar enableHighAccuracy en false no me funciona. Entonces, esta solución que parece perfecta no funciona para mí.

Enfrenté un problema similar con varias solicitudes (seleccionando continuamente usar la ubicación actual). He agregado reintento para la solicitud de ubicación. no es el problema exacto, pero puede ayudar a alguien.

import retry from 'retry'
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
  const operation = retry.operation({ retries: 2 });
  operation.attempt(() => {
    navigator.geolocation.getCurrentPosition(
      (response) => { resolve(response) },
      (error) => {
        if (operation.retry(error)) {
          return;
        }
        reject(error)
     },
     { timeout: 2000, enableHighAccuracy: true, maximumAge: 100 },
   );
 })
} else {
  reject(new Error('Location access denied'))
}

https://www.npmjs.com/package/react-native-geolocation-service
Este paquete me solucionó el problema.
Casi todas las sugerencias anteriores no funcionaron para mí.

Hola, Invitado, resuelvo el misterio, lo que pasó es que cuando preguntamos por la ubicación la primera vez y usamos "maximunAge" no tenemos una ubicación previa en caché, así que hay un error, asegúrate de que la primera vez que pidas la ubicación no tiene "maximunAge"

la respuesta simple es salir de donde estás e ir al espacio abierto y luego intentarlo de nuevo.

Su ciencia simple.

Los servicios de GPS se ven afectados por muros gruesos y automóviles.

Esto funcionó para mí. ¡No es necesario editar nada!

En mi caso, eliminar maximumAge resolvió el problema.

¡Muchas gracias! ¡Trabajo!

Hola,
Ninguna de las soluciones me funciona.
Yo uso navigator.geolocation, usando solo {enableHighAccuracy: false} como tercer parámetro.
En iOS funciona bien y en Android no funciona en ciertos dispositivos.
He verificado en Android 7, 8, 9. No funciona en el teléfono Lenovo con Android 7. Pero funciona con otros dispositivos con Android 7.

¿Alguien tiene alguna solución para resolver este problema?
Cualquier sugerencia es apreciable.

Gracias

@akhilsanker tal vez pruebe una biblioteca como react-native-fused-location

Hola @reyalpsirc ,

Gracias por la respuesta. Realmente aprecio por su tiempo.
No hay ningún problema en iOS y funciona bien en la mayoría de los dispositivos Android. Tengo una limitación de tiempo limitada y será difícil usar una nueva biblioteca, como sugirió.
¿Tiene alguna otra solución para resolver este problema?
Gracias por tu tiempo.

Gracias.

Lo siento @akhilsanker , todo lo que hice fue usar la geolocalización de react native para iOS y FusedLocation para Android.

configurar maximumAge:0 funcionó para mí:
{ enableHighAccuracy: true, timeout: 60000, maximumAge:0 }
tal vez @GersonM tenga razón ...

El módulo de geolocalización se elimina de RN en el maestro y no estará disponible en 0.60. Utilice https://github.com/react-native-community/react-native-geolocation e informe los problemas allí. Gracias

Es 2019, probé 3 bibliotecas de ubicación diferentes, ninguna de ellas funciona para Android. Asombroso.

Es 2019, probé 3 bibliotecas de ubicación diferentes, ninguna de ellas funciona para Android. Asombroso.

react-native-geolocation-service está funcionando bien.

Si un paquete no funciona, cree un ticket de emisión en ese repositorio. Los problemas no se solucionarán solos, únete a la comunidad.

ver el comentario <uses-permission> <permission> __ y__ <uses-permission>

https://www.npmjs.com/package/react-native-geolocation-service
Este paquete me solucionó el problema.
Casi todas las sugerencias anteriores no funcionaron para mí.

¡Gracias!

¿Fue útil esta página
0 / 5 - 0 calificaciones