React-native: Die Geolocation 'enableHighAccuracy' unter Android läuft immer ab

Erstellt am 10. Mai 2016  ·  239Kommentare  ·  Quelle: facebook/react-native

Beim Entwickeln einer Android-App gibt die Geolocation-API beim Debuggen auf meinem Android-Gerät unter 6.1 immer einen Fehlerrückruf mit der Meldung Location request timed out .

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

Wenn ich die Option enableHighAccuracy auf false umschalte, funktioniert die API einwandfrei. Im Modus mit hoher Genauigkeit dauert das Zeitlimit immer so lange, wie ich es in der Zeitlimitoption angegeben habe, dh 20 Sekunden.

Ich habe versucht, mit ausgeschaltetem Dev-Modus zu laufen.

Sollte der hochgenaue Modus in Android funktionieren?

Geolocation Bug Help Wanted Android Ran Commands Locked

Hilfreichster Kommentar

Das Setzen von enableHighAccuracy auf true oder false funktioniert bei mir nicht.
Das Weglassen des dritten Arguments für getCurrentPosition zur Verwendung von Standardwerten aus dem nativen Modul funktioniert für mich.

Alle 239 Kommentare

@ acapop77 Ich habe auch vergessen zu erwähnen, dass Berechtigungen aktiviert werden mit:

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

Ich habe das gleiche Problem mit RN 0.25.1, der Unterschied besteht darin, dass das Problem für mich bei hoher und niedriger Genauigkeit weiterhin besteht. Endlich habe ich etwas gefunden, das es funktioniert, aber keine Lösung ist.

Folgendes hat bei mir funktioniert - vorausgesetzt, Sie verwenden den Standard-Android-AVD-Emulator:

  1. Gehen Sie im Android-Emulator-Gerät zu "Einstellungen> Standort" (wie auf dem tatsächlichen Gerät) und stellen Sie den Modus auf "Hohe Genauigkeit".
  2. Gehen Sie zurück zur Anwendung.
  3. Drücken Sie die Taste "Erweiterte Steuerelemente" (dargestellt durch "..."). Als nächstes sehen Sie im Abschnitt Standort die GPS-Datenpunktdaten und die Schaltfläche "Senden". Klicken Sie einfach auf "Senden" und schließen Sie das erweiterte Steuerungsmenü.
  4. Anwendung neu laden.

Dies funktioniert für mich - auf "einmaliger Basis". Jedes Mal, wenn ich die App neu laden möchte, muss ich erneut 3-4 Schritte ausführen. Aber zumindest auf diese Weise kann Geolocation funktionieren und es wird kein Timeout-Fehler angezeigt.

Ich erlebe etwas Ähnliches in 0.24. Obwohl sich <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> in meiner AndroidManifest.xml befindet, erhalte ich die rote Fehlermeldung:

"Sieht so aus, als hätte die App keine Berechtigung zum Zugriff auf den Speicherort. Fügen Sie die folgende Zeile hinzu ..."

Ich benutze den Emulator nicht und baue stattdessen direkt auf dem Gerät.

Bearbeiten - dies geschieht auch in 0.25.1

@ acapop77 @rossthedevigner Ich

@Findiglay Gleich hier. Ich habe sogar versucht, eine manuelle APK-Installation durchzuführen, und trotzdem ist der Fehler aufgetreten.

Ich versuche eine Problemumgehung, bei der ich das Berechtigungsmanifest durchlaufe und sehe, ob android.permission.ACCESS_FINE_LOCATION aktiviert ist.

Hat jemand navigator.geolocation == undefined?

Ich habe derzeit dieses Problem auf meinem Gerät.

Hier werden verschiedene Probleme gemeldet. Ich bin nicht sicher, ob alle für das spezifische Problem mit enableHighAccuracy relevant sind.

Ich habe keine Erfahrung mit der Android-Entwicklung, aber ich habe festgestellt, dass mein Standort korrekt zurückgegeben wird, wenn ich LocationModule.java bearbeite, um die LocationOptions boolean highAccuracy = true; zu codieren und neu zu erstellen. Ich bin nicht sicher, ob sich die Ergebnisse von denen unterscheiden, die mit der Einstellung enableHighAccuracy: false in der Geolocation-API von React-Native erhalten wurden, aber es sollte sicher sein, dass dies im Modus mit hoher Genauigkeit ausgeführt wird.

Könnte dies bedeuten, dass der Fehler in der Brücke zwischen der Geolocation-API und dem LocationModule auftritt?

Ich habe das gleiche Problem. Ich habe das gleiche getan , wie

Irgendeine Idee, warum dies auf realen Geräten passiert? :(

Das gleiche Problem haben. Ich verwende die App derzeit auf realen Geräten mit RN 0.25.1.

Ich sollte hinzufügen, dass ich dem Berechtigungsmanifest bereits die erforderlichen Android-Berechtigungen hinzugefügt habe. Aber immer noch Auszeiten.

Als Problemumgehung habe ich in den Android-Einstellungen "Scheinstandorte zulassen" aktiviert und eine App installiert, die das GPS verspottet (suchen Sie nach gefälschten GPS im Geschäft). Zumindest bis dies behoben ist, wird die Entwicklung nicht blockiert

Ich Jungs,
Ich hatte den gleichen Fehler, aber nach einigen Wiederholungen mit meinen Kollegen stellen wir etwas Seltsames fest (aber normal, wenn Sie etwas über GPS wissen).

Wenn Sie Tests "in Ihrem Büro" mit einem physischen Gerät ausführen, kann der GPS-Ortungsgerät durch äußere Einflüsse wie Wände oder durch den einfachen Grund, dass Sie versuchen, diesen Vorgang "drinnen" durchzuführen, gestört werden. Dies sollte im Allgemeinen im Freien durchgeführt werden .

Nun, nachdem wir unser Büro verlassen haben, führen wir die Tests erneut aus und das Gerät reagiert wie geplant (wir haben den Fehler "Zeitüberschreitung bei Anforderung" nicht erhalten).

Mein Vorschlag ist: Versuchen Sie die Geolokalisierung mit "enableHighAccuracy" auf "true". Wenn dies fehlschlägt (im Büro kann dies fehlschlagen), versuchen Sie es erneut mit "false". Dies sollte funktionieren, in meinem Fall.

Hoffe das kann helfen.

+1

Gleiches Problem hier, ob enableHighAccuracy auf true oder false .
Es funktioniert auf GenyMotion-Emulatoren, jedoch nicht auf echten Geräten (getestet auf Samsung, Nexus, Mi).
Berechtigung in AndroidManifest.xml aktiviert
Code:

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

Das Setzen von enableHighAccuracy auf true oder false funktioniert bei mir nicht.
Das Weglassen des dritten Arguments für getCurrentPosition zur Verwendung von Standardwerten aus dem nativen Modul funktioniert für mich.

Gleiches Problem hier mit LGE Nexus 5 (Android 6.0).
Unter Android 5.1.1 und 4.3 gibt es kein solches Problem.
Im Emulator mit Android 6.0 gibt es kein solches Problem.
boolean highAccuracy = false; funktioniert nicht.
RN 0,28,0.

Hey Leute, ich habe eine vorübergehende Lösung gefunden - dieses Paket https://github.com/lucasferreira/react-native-android-permissions

Irgendwelche Updates oder Korrekturen dafür? Auf Simulator- und Pre 5.0-Geräten funktioniert alles einwandfrei, danach nur noch eine Zeitüberschreitung, und ich brauche dringend einen Fix für eine bereits verfügbare App!

+1

Dieses Problem wird durch die Einstellung locationMode auf dem Gerät beeinflusst. Wenn der Standortmodus entweder auf hohe Genauigkeit oder nur auf Gerät eingestellt ist, tritt eine Zeitüberschreitung bei der Geolokalisierung auf. Es funktioniert ordnungsgemäß, wenn der Standortmodus auf Batteriesparen eingestellt ist

Ich hatte das gleiche Problem, ich nahm einen Kahn und entfernte das 3. Argument. Und es funktioniert jetzt.

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

Ich gehe davon aus, dass dies mit Folgendem zusammenhängt:

Recht?

Nein, das war für das Problem mit dem Standort-Timeout

Ja, ich hatte gerade herausgefunden, dass das Entfernen des dritten Arguments eine Lösung zu sein scheint.

Wir haben das Gerät noch nicht vollständig getestet, aber es scheint, dass die Android-Version 22, bei der der Gerätemodus entweder auf hohe Genauigkeit oder nur auf das Gerät eingestellt ist, zu einer Zeitüberschreitung des Speicherorts führt, wenn das dritte Argument unabhängig von den Einstellungen enthalten ist. Es scheint Android Version 23 nicht zu beeinflussen.

Dieselbe Erfahrung auf meiner Seite, außer dass Android Version 23 nur mit dem dritten Argument funktioniert, wenn enableHighAccuracy auf false ( true führt zu einer Zeitüberschreitung des Standorts). Auch auf Android Version 22, 21, 20 & 19 getestet und es scheint, dass das Vorhandensein des 3. Arguments in allen Fällen eine Zeitüberschreitung verursacht. Das Entfernen dieses Arguments scheint die einzig verlässliche Lösung zu sein.

Wenn Sie das dritte Argument entfernen, wird das Popup "Zeitüberschreitung der Standortanforderung" sofort angezeigt, anstatt zu warten, bis das Zeitlimit abgelaufen ist. Das Setzen von enableHighAccuracy auf false funktioniert ebenfalls nicht.

Auf meinem Emulator ist der Speicherort nur verfügbar, wenn ich die Emulatoreinstellungen öffne und einen Speicherort sende (siehe Screenshot).

Gibt es eine Möglichkeit, es automatisch zu bekommen?

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

In meinem Fall hat das Setzen von enableHighAccuracy auf false das Problem gelöst.

Ich habe hier das gleiche Problem, sowohl auf dem Emulator als auch auf dem Gerät, und habe es mit true und false für enableHighAccuracy versucht

Ich bekomme geradezu "undefiniert ist kein Objekt (Auswertung von 'navigator.geolocation.getCurrentPosition')"

Ich habe versucht zu überprüfen, ob (Navigator), das true zurückgegeben hat,
aber wenn (navigator.geolocation) false zurückgegeben hat.

Dies geschieht auch auf einem Gerät unter Android 5.1 OnePlus One. Entwicklermodus aktiviert, AndroidManifest-Berechtigungen enthalten, Scheinpositionen ein / aus, alles.

Außerdem schien ich nicht nach Standortberechtigungen gefragt zu werden, obwohl ich die App auf dem Gerät und den Ausgabeordner auf meinem Mac gelöscht habe.

Ich kann auch nicht remote debuggen, da ich React Realm verwende und das Ding RIESIGE Probleme hat, die den Chrome-Remote-Debugger von innen nach außen schrauben.

Ich habe ein ähnliches Problem, möglicherweise läuft die App nicht immer ab, ABER es tut es oft, wenn andere Geolokalisierungs-Apps jedes Mal gut funktionieren, wenn die mit RN eine sehr schlechte Geolokalisierung hat.
Ich benutze RN 0.32, aber ich hatte das gleiche Problem mit jeder Version, aus irgendeinem Grund ist die Geolokalisierung in RN sehr seltsam und schlecht (zumindest auf Android).

Gleiches Problem hier, Testen auf einem realen Gerät.

Darauf zu stoßen und das ist wirklich nervig: /

Ich habe das gleiche Problem auf Android 6.0.

+1

Ich fand eine Lösung darin, keinen dritten Parameter hinzuzufügen und die oben verlinkte Bibliothek (https://github.com/lucasferreira/react-native-android-permissions) für die Android-Version> = 23 zu verwenden, um Android M-Berechtigungen anzufordern.

Gerade entdeckt PermissionsAndroid wurde jetzt zu RN hinzugefügt. Verwenden Sie dies, um anzufordern, ob auf Android> = 23

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

Aber ich habe Android 5.1.1 auf meinem Gerät. Auf diesem v. Von Android muss Geolocation gut funktionieren, nicht wahr?

23 ist ab 6.0. Ich fand auch, dass ich den 3. Parameter nicht hinzufügen musste, damit er auf alles funktioniert.

Ich habe es geschafft, das zum Laufen zu bringen, aber es könnte für Sie anders sein. Neuere Versionen von RN (Mine ist 0.32.1) enthalten eine Datei namens MainApplication.java (neben MainActivity.java). In den React Native Mapbox GL-Dokumenten heißt es, dass Sie das ReactNativeMapboxGLPackage in MainActivity.java aufnehmen müssen, dies jedoch in MainApplication.java, damit es ungefähr so ​​aussieht:

MainApplication.java

`. . .

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

};
`

Und MainActivity.java würde wie immer bleiben.

Meine Android-Version ist 23, daher verwende ich immer noch die Berechtigungen aus der Manifest-XML

Wenn GPS auf dem Gerät aktiviert ist, gibt die App den Standort in Ordnung zurück. Wenn ich ihn jedoch ausschalte, wird der Standort zurückgegeben: error: No available location provider.

Wie kann ich das Gerät zum aktiven GPS-Standort zwingen?

Das ist verrückt = /

Ich hatte in den letzten Wochen getCurrentPosition Arbeit an meinem Genymotion Android-Emulator, aber jetzt schlägt es wieder fehl.

Ich verwende das GPS-Widget von Genymotion, um den Standort festzulegen. Ich habe Google Maps auf dem Emulator installiert und Google Maps kann meinen Standort problemlos lesen.

Ich habe alle erforderlichen Berechtigungen und verwende sogar das Modul PermissionsAndroid wie von @sattaman vorgeschlagen. Es scheint, dass das Verhalten nicht deterministisch ist, da es an einem Tag funktioniert und am nächsten gebrochen wird.

Ich bin auf RN 0.31 und das Entfernen des dritten Parameters hat auch für mich funktioniert! Echtes Gerät, Nexus 5X, Android 6.

Ich habe das gleiche Problem mit RN 0.34.1, aber das Entfernen des dritten Parameters kann es beheben
Wenn Sie enableHighAccuracy auf false setzen, wird dieses Problem nicht gelöst

Gleiches Problem mit mir auf RN 0.32, versucht mit Android 22 & 23,

enableHighAccuracy auf true oder false funktioniert bei mir nicht
Das Entfernen des dritten Parameters führt zu einem sofortigen "Zeitlimit für Standortanforderung".
Ein Neustart meines Geräts funktioniert jedoch, wird jedoch nach einiger Zeit unterbrochen.

Um den Standort des Benutzers zu ermitteln, verwende ich einfach Folgendes:
https://github.com/mauron85/react-native-background-geolocation

@acondense Wo legen Sie den Code für die Hintergrund-Geolokalisierung fest, da die Standortfunktion anscheinend nicht ausgeführt wird

Ich habe das gleiche Problem auf RN 0.35 mit Android 23 und 24 getroffen, funktioniert aber gut mit Android 22.
Möglicherweise hängt dies mit dem Laufzeitberechtigungssystem für Android 6.0 zusammen:
http://stackoverflow.com/questions/32224534/access-fine-location-permission-error-emulator-only

Ich benutze diese Bibliothek, um dieses Problem zu vermeiden und es funktioniert gut!
https://github.com/yonahforst/react-native-permissions

Das Entfernen des dritten Parameters hat es auch für mich behoben 💯 💯 💯

Das Entfernen des dritten Parameters hat funktioniert 👍

Es war von Anfang an nicht so klar, über welchen Parameter alle sprachen, den Methodenparameter oder den dritten Parameter des Optionsobjekts.

Um genau zu sein, ist es der dritte Parameter der getCurrentPosition -Methode, der am Ende ungefähr so ​​aussieht:

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

Schließlich kam ich mit der folgenden Lösung (die gleiche Idee wie oben beschrieben):

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
    )
}

Es funktioniert auf Geräten (getestet auf Android 21, 22 und 23), aber für Android 23 ist es kritisch langsam: 5 - 10 Sekunden.

Hat jemand LocationServices.FusedLocationApi als Workaround für diesen Zweck in React-Native verwendet (nativ in Java-Code für Android implementiert)?

enableHighAccuracy: true funktionieren überhaupt nicht auf Android

Ich verwende diesen Code, um die Standortberechtigung unter Android 6 zu überprüfen

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 Dies verhindert Location request timed out Fehler?

Verwenden Sie mein Snippet und dieses auch https://github.com/facebook/react-native/issues/7495#issuecomment -259753488

Gibt es noch keine Lösung dafür? Ich habe absolut alles in diesem Thread ausprobiert und nichts funktioniert für mich. Es ist immer ein Timeout-Fehler, entweder sofort oder nach ein paar Sekunden.

Gleiches hier, @sattaman Kommentar behoben es für mein Gerät (Standortmodus auf Batteriesparen einstellen), aber wie man Benutzer der App anweist , so etwas zu tun!

Entweder das Deaktivieren von enableHighAccuracy oder das Auslassen des 3. Parameters funktioniert für mich. Die Lage sieht jedoch immer noch ziemlich genau aus.
Keine Probleme unter iOS. (RN 0,39)

RN 0.40 gleiche Ausgabe. Das Entfernen des 3. Parameters löst das Problem.
(Aber Sie erhalten keine hohe Genauigkeit)

Das gleiche Problem, das Entfernen des 3. Parameters, löst es.

Auf einem Emulator muss ich enableHighAccuracy: true und sicherstellen, dass der Standortmodus auf Hohe Genauigkeit eingestellt ist. Sonst läuft es ab. Ich kann unter keinen Umständen eine Batteriesparleistung für einen Emulator erzielen.

Auf einem Gerät übergebe ich überhaupt keine Optionen. Wenn Sie wie ich damit zu kämpfen haben, empfehle ich, es auf echten Geräten zu versuchen. Ich habe auf einem Pixel C (Android 7.1) und Note 4 (Android 6.0.1) getestet.

Unter iOS musste ich High Accuracy auf True setzen. Sie können sich vorstellen, dass ich an dieser Stelle die Funktion zum Abrufen des Standorts habe ...

Ich arbeite an RN 0.40 und benutze ein echtes Gerät (Nexus 5) und habe immer noch das Problem.

Ich habe alles aus allen Kommentaren in dieser Ausgabe versucht.

Hat jemand das Problem auf eine andere, hier nicht erwähnte Weise gelöst?

// UPDATE:

Es scheint, dass navigator.geolocation.watchPosition funktioniert. Die Verwendung könnte also die Problemumgehung sein, bis navigator.geolocation.getCurrentPosition behoben ist.

Im Moment werde ich ein natives Modul schreiben und direkt mit nativen APIs sprechen, da mir die Verwendung einer hohen Genauigkeit wichtig ist.
Die Geolocation-API von RN scheint vorerst instabil zu sein.

In meinem Projekt finde ich einige Regeln heraus.

  1. Die Android-Geräteeinstellung - Der Speicherort ist nur das Gerät. Sie sollten NICHT enableHighAccuracy: true auf getCurrentPosition setzen
  2. Die Einstellung - Position ist hochgenau. Sie sollten enableHighAccuracy: true auf getCurrentPosition setzen

In Übereinstimmung mit diesen beiden Regeln funktioniert es in meinem Projekt gut

@ Kimochg Was ist dein Test-Setup?

In meinen Tests führt das Festlegen der Geräteeinstellung für "Nur Standort auf Gerät" jedes Mal zu einem TimeOut, unabhängig von der geografischen Position enableHighAccuracy .

Wenn Sie die Geräteeinstellung auf Hohe Genauigkeit einstellen, erhalte ich einen gültigen Speicherort, unabhängig davon, auf was enableHighAccuracy ist.

BEARBEITEN
Es scheint, dass Geolocation für mich nur dann einen neuen Standort abruft, wenn ich enableHighAccuracy: false und die Gerätestandorteinstellung auf Hohe Genauigkeit eingestellt habe. Mit enableHighAccuracy: true wird ein zwischengespeicherter Speicherort abgerufen, bei einem erneuten Abruf tritt jedoch eine Zeitüberschreitung auf.

Dies ist auf React Native 0.40, das auf Nexus 5X mit Android 7.1.1 getestet wird

@kulmajaba einige, wie Sie Native 0.40
aber Android Emulator hier, kein echtes Android-Gerät

Wenn Sie einen Emulator verwenden,
Klicken Sie auf die Schaltfläche "Erweiterte Steuerelemente" in der rechten Leiste des Emulators und senden Sie GPS-Daten?
(die Taste)

@ Kimochg Ok. Ich verwende ein echtes Gerät zum Testen. Wenn ich das nächste Mal an dem Projekt arbeite, muss ich das Verhalten des Emulators damit vergleichen.

@Ascendance @ Daniel-ltw Ich habe alle Lösungen in diesem Thread verfolgt und konnte die gefürchteten undefinierten Probleme von navigator.geolocation nicht erschüttern. Dann habe ich navigator angemeldet.

Folgendes habe ich zurückbekommen:

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

Dann wurde mir klar, dass dies von der Navigator-Komponente kam. Beim Rendern von Routen wird (route, navigator) verwendet. Sicher genug, das Entfernen der Navigatorvariablen und das erneute Protokollieren ergab:

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

Ich hoffe, das hilft jemand anderem - ich habe traurig viel Zeit gebraucht, um zu erkennen, was das Problem war. : /

@kulmajaba Der Parameter maximumAge alle Caching-Probleme für mich behoben. Wenn Sie den Wert auf 0 setzen, wird er gezwungen, immer eine neue Position zu erhalten.

Für alle anderen, die mit dem Timeout-Problem zu kämpfen haben, habe ich gelesen, dass GPS-Anrufe mit hoher Genauigkeit manchmal eine Weile dauern können (ab einer Minute), insbesondere in Innenräumen - wie @RoBYCoNTe oben ausgeführt hat.

Sich von Anfang an auf einen Anruf mit hoher Genauigkeit zu verlassen, ist möglicherweise nicht der beste. Vielleicht ist es besser, zuerst einen Anruf mit niedriger Genauigkeit zu erhalten und einen Anruf mit hoher Genauigkeit im Hintergrund zu starten. Dies hängt natürlich von Ihren Bedürfnissen ab. Eine Minute + auf einen Anruf zu warten ist nicht jedermanns Sache :)

Angesichts der Tatsache, dass RN die Webspezifikation für die Geolokalisierung erweitert, finden Sie im Web entsprechende Antworten, wie z. B. http://stackoverflow.com/questions/3752383/geolocation-is-so-slow-what-im- falsch machen

Hat jemand eine solide Lösung? Einige Benutzer können sich nicht einmal für meine App registrieren, da sie aufgrund eines Teils der Registrierung ihre Geolokalisierung festlegen müssen. Das Problem tritt nur auf einigen Android-Geräten auf, und ich verwende nicht den 3. Parameter. Macht mich verrückt. Die Leute geben meiner App einfach automatisch 1-Sterne-Bewertungen, weil sie ihre Geolokalisierung nicht festlegen können, hahaha. >.>

@booboothefool versuchen Sie es mit dem Parameter options und übergeben Sie highAccuracy als
falsch. Die Ergebnisse sind auf diese Weise viel schneller.

Am Montag, 20. Februar 2017, 9:50 Uhr booboothefool [email protected]
schrieb:

Hat jemand eine solide Lösung? Einige Benutzer können sich nicht einmal für meine registrieren
App aufgrund eines Teils der Registrierung, bei der sie ihre Geolokalisierung festlegen müssen.
Das Problem tritt nur auf einigen Android-Geräten auf, und ich habe es nicht
mit dem 3. Parameter. Macht mich verrückt.

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/facebook/react-native/issues/7495#issuecomment-281142941 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/ADJE_BC-osVA45bcpejEI_paDEBykBs1ks5redJtgaJpZM4Ibete
.

@ Greyvugrin Okay, ich werde das

Ebenfalls basierend darauf: https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions

Es scheint, dass dies die Standardoptionen sind. enableHighAccuracy: false mit timeout: Infinity , sollte es das also nicht schon tun, wenn ich den 3. Parameter nicht gebe?

@booboothefool Sie haben Recht, dass dieser Thread verwirrend ist. Nach allem, was ich sagen kann, haben die Leute, die den Optionsparameter weglassen, möglicherweise ihr Problem gelöst, weil etwas anderes in den Einstellungen die Dinge beeinflusst hat.

Das Setzen von enableHighAccuracy auf true oder false funktioniert bei mir nicht.
Das Weglassen des dritten Arguments für getCurrentPosition zur Verwendung von Standardwerten aus dem nativen Modul funktioniert für mich.

Das Problem könnte also bei timeout . Es gibt viele Faktoren, die bei der Geolokalisierung eine Rolle spielen. Es hilft, so viele Informationen wie möglich von den abstürzenden Personen zu erhalten.

Wenn Sie die Optionen bereits entfernt hatten und RN standardmäßig dieselben Parameter wie das Web verwendet, sollten die Dinge einwandfrei funktionieren. Wenn Sie immer noch Probleme haben, prüfen Sie möglicherweise, ob für die Benutzer Berechtigungen für den Standort aktiviert sind (und überprüfen Sie dies in Ihrer App).

Hey @greyvugrin ,

Vielen Dank für den großen Tipp zu den Berechtigungen. Ich denke, das hat mir gefehlt. Nach der Implementierung von https://github.com/lucasferreira/react-native-android-permissions (ich bevorzuge diese API gegenüber https://facebook.github.io/react-native/docs/permissionsandroid.html) und der Angabe von enableHighAccuracy: false und das Festlegen eines timeout scheint jetzt für alle zu funktionieren.

Meine App wurde von 1 Stern im Google Play Store von allen wegen der Geolokalisierungsprobleme auf 3,6 Sterne verworfen, hahaha! 👍

@booboothefool das sind so tolle Neuigkeiten,

Ich habe alle hier vorgeschlagenen Ansätze ausprobiert. Von getCurrentPosition kann nichts außer Timeouts auf dem Simulator oder dem Gerät auf Android abgerufen werden. watchPosition funktioniert, bietet aber nicht wirklich die beste UX für den Benutzer. Ich benötige den Standort des Benutzers nur einmal. Ich muss das GPS nicht für die Verschwendung des Akkus verwenden.

Ich habe es versucht:

  • enableHighAccuracy: false
  • Optionsargument entfernen
  • nach Erlaubnis suchen und um Erlaubnis bitten android> = 23
  • Sowohl FINE als auch COARSE im Manifest.

Keine ändert die Zeitüberschreitung für getCurrentPosition

Dies ist nur etwas, was die Entwickler von Android Studio Emulator in Zukunft reparieren / implementieren müssen, wenn sie eine Chance bekommen.

In der Zwischenzeit jedoch ... Sie können eine große GPX-Traildatei importieren und mit "1x" Geschwindigkeit wiedergeben lassen. Ich habe mir von hier aus eine GPX geholt ...
... diese Datei dauerte ungefähr 8 Minuten bei "5x" Geschwindigkeit, also sollte sie bei "1x" Geschwindigkeit ungefähr 40 Minuten dauern.

Laden Sie es (oder eine andere möglicherweise größere GPX-Datei) in die [...] erweiterten Optionen-> Speicherort (GPS / KML-Schaltfläche unten rechts laden), drücken Sie die Wiedergabetaste und schließen Sie das Fenster ... es wird weiter abgespielt bis es das Ende erreicht. Schade, dass es keine automatische Wiederholung gibt - eine weitere Funktionsanforderung für Android Studio-Programmierer. :-)

Das ist nicht wahr. Ich bekomme die gleichen Timeouts auf realen Geräten.
getCurrentPosition läuft immer ab. Uhr funktioniert gut. Testen von Z5, Nexus 5X
& Pixel, Alle Zeitüberschreitung beim ersten Aufruf von getCurrentPosition.

Am Samstag, 4. März 2017, 19:49 Uhr schrieb Deen Foxx, [email protected] :

Dies ist nur etwas, was die Entwickler von Android Studio Emulator tun werden
müssen in der Zukunft reparieren / implementieren, wenn sie eine Chance bekommen.

In der Zwischenzeit jedoch ... Sie können eine große GPX-Trail-Datei importieren und lassen
es wird mit "1x" Geschwindigkeit wiedergegeben. Ich habe mir von hier aus eine GPX geholt ... ExpertGPS.com ->
ca-trails.gpx
https://www.expertgps.com/data/downloading.asp?file=ca/ca-trails.gpx
... diese Datei dauerte ungefähr 8 Minuten bei "5x" Geschwindigkeit, also bei "1x" Geschwindigkeit
SOLLTE ungefähr 40 Minuten dauern.

Laden Sie es (oder eine andere möglicherweise größere GPX-Datei) in die [...] Erweiterte
Optionen-> Standort (GPS / KML-Schaltfläche unten rechts laden), drücken Sie die Wiedergabetaste
Knopf, dann schließe das Fenster ... es wird so lange abgespielt, bis es das trifft
Ende. Schade, dass es keine automatische Wiederholung gibt - eine weitere Funktionsanforderung für Android
Studio-Programmierer. :-)

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/facebook/react-native/issues/7495#issuecomment-284172310 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/AACQ6AoZYXJ02DCmevcLmmF3tuOdg_SEks5ribJHgaJpZM4Ibete
.

Das Entfernen des dritten Parameters zu getCurrentLocation funktionierte für mich auf dem Emulator.

{
   timeout: 20000,
    maximumAge: 1000
}

Ich habe gerade eine Drei-Pass-Möglichkeit codiert. Vielleicht ein bisschen übertrieben, aber na ja. Hier ist das Code-Snippet (mit Kommentaren) ...

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;

Ich habe dies nur auf lokalen Entwickleremulatoren getestet, nicht in der Produktion. Lassen Sie mich wissen, ob dies für Sie hilfreich war.

Ich dachte nur ... es würde wahrscheinlich perfekt als Zwei-Pass funktionieren, wenn Ihr RoughError-Aufruf nur die Version ohne Option verwendet ...

  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
        }
      );
  };

Das würde dazu führen, dass die Android-Handys mit Problemen keine Verzögerung mehr haben, aber dennoch die hohe Genauigkeit versuchen. Dann würden Sie den FineError überhaupt nicht mehr benötigen, dieser Code kann entfernt werden.

  • Ja, ich weiß, dass es eine geringfügige Möglichkeit gibt, dass der Versuch "enableHighAccuracy: true" vor den anderen asynchronen "groben" Ergebnissen zurückkehrt (insbesondere wenn das Timeout Infinity ist) und somit verloren geht / überschrieben wird ... aber ich bezweifle es. Wenn Sie wirklich so vorsichtig sein möchten, können Sie den Code ändern, um ihn für diesen speziellen Fall zu testen.

Irgendwelche Fortschritte in diesem Bereich?

Alex, es gibt ein paar Lösungen für diesen Thread. Was hast du versucht? Es
Es kann sich auch lohnen, ein neues Ticket zu erstellen, wenn Sie seitdem mehr Details haben
Dieser Thread ist so lang, wenn keine der oben genannten Lösungen funktioniert.

Am Fr, 17. März 2017, 10:29 Uhr Alex Sinelnikov [email protected]
schrieb:

Irgendwelche Fortschritte in diesem Bereich?

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/facebook/react-native/issues/7495#issuecomment-287419487 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete
.

Wie du. Keiner der oben genannten Vorschläge funktioniert. Die einzige Lösung für mich
Einen Standort auf Android zu bekommen war, eine Uhr zu verwenden und die Benutzeroberfläche zu aktualisieren, um zu informieren
Der Benutzer, was passiert, wenn Ihre Apps auf locat antworten. Tu es nicht
Mit getCurrentPosition funktioniert es bei keinem der 10 echten Tests
Geräte, auf denen verschiedene Android-Versionen 4+ ausgeführt werden

Am Fr, 17. März 2017, 17:48 Uhr schrieb Gray Vugrin, [email protected] :

Alex, es gibt ein paar Lösungen für diesen Thread. Was hast du versucht? Es
Es kann sich auch lohnen, ein neues Ticket zu erstellen, wenn Sie seitdem mehr Details haben
Dieser Thread ist so lang, wenn keine der oben genannten Lösungen funktioniert.

Am Fr, 17. März 2017, 10:29 Uhr Alex Sinelnikov [email protected]
schrieb:

Irgendwelche Fortschritte in diesem Bereich?

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
<
https://github.com/facebook/react-native/issues/7495#issuecomment -287419487
,
oder schalten Sie den Thread stumm
<
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete

.

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/facebook/react-native/issues/7495#issuecomment-287424598 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/AACQ6DgWuUzw4hj7rmr8LDzcRHjEheIcks5rmsdSgaJpZM4Ibete
.

Manchmal funktioniert es, manche nicht. Ich habe ALLE oben genannten Lösungen ausprobiert und bisher keine zuverlässige Lösung. Das macht mich wirklich verrückt :(

Gibt es ein natives Modul, das Funktionen wie getCurrentPosition repliziert? Ich suche ein anderes Repo, weil ich keinen Java-Code schreiben kann.

watchPosition hat ein Problem, wenn der Standort nicht aktiviert ist. Es wird niemals eine Zeitüberschreitung ausgelöst, obwohl ich die Zeitüberschreitung auf 1000 gesetzt habe

Bei 'getCurrentPosition' wird eine Zeitüberschreitung ausgelöst, sodass ich den Standortdialog auslösen kann, um GPS zu aktivieren. Aber jetzt gehe ich von 'getCurrentPosition'

BEARBEITEN:
Ich habe alle Variationen ausprobiert und weiß jetzt, wo das Problem liegt. Ich kann es zum Laufen bringen, wenn ich dritte Parameter entferne UND den Standortmodus entweder auf Hohe Genauigkeit oder Batteriesparen setze. Sonst funktioniert es nicht. Ich weiß nicht, wie ich den Benutzer anweisen soll, anstelle von "Nur Gerät" die Option "Hohe Genauigkeit" oder "Batteriesparen" zu wählen, da der Zugriff auf dieses Menü für jeden Anbieter unterschiedlich ist.

Es gibt oben einen Kommentar zum Hinzufügen von enableHighAccuracy: false in dritten Parametern, der jedoch für die Optionen "Hohe Genauigkeit", "Batteriesparen" oder "Nur Gerät" nicht funktioniert hat. Ich denke, dritte Parameter in der Geolokalisierung sind für echte Geräte nutzlos.

location-mode-100621707-large

In meinem Fall hat das Entfernen von MaximumAge das Problem gelöst.

Das Entfernen von MaximumAge funktioniert, dies ist jedoch eine vorübergehende Lösung. Funktionierte in den meisten Fällen einwandfrei, stieß jedoch in der Produktion auf einige Probleme, bei denen auf einer Karte der aktuelle Standort des Benutzers aufgrund der Verwendung veralteter Koordinaten vollständig deaktiviert war. Stattdessen wurde auf eine native Implementierung umgestellt.

@nigelnindo was meinst du mit Native Implementation? innerhalb von RN oder direkt in Android?

@ L3V147H4N direkt in Android. Es gibt einige Bibliotheken, die Sie dafür verwenden können, aber ich habe gesehen, dass die meisten nicht mit den neuesten Versionen von RN kompatibel sind. Wenn es genug Interesse daran gibt, macht es mir nichts aus, einige Zeit damit zu verbringen, ein einfaches Modul zu erstellen, um die in diesem Thread beschriebenen Geolokalisierungsprobleme unter Android zu lösen.

Vielleicht können Sie https://github.com/mauron85/react-native-background-geolocation#getlocationssuccess -fail überprüfen

Es ist eine native Implementierung und funktioniert gut für mich.

Ich denke, fast jeder in diesem Thread wäre @nigelnindo sehr dankbar
https://github.com/nigelnindo

Am Montag, den 3. April 2017 um 17:34 Uhr schrieb Nigel Nindo [email protected] :

@ L3V147H4N https://github.com/L3V147H4N direkt in Android. Es gibt
ein paar Bibliotheken, die Sie dafür verwenden können, aber das habe ich am meisten gesehen
sind nicht mit den neuesten Versionen von RN kompatibel. Wenn es genug gibt
Ich habe nichts dagegen, etwas Zeit damit zu verbringen, ein einfaches Modul zu erstellen
um die in diesem Thread beschriebenen Geolokalisierungsprobleme unter Android zu lösen.

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/facebook/react-native/issues/7495#issuecomment-291198134 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/AACQ6BwArzmfCk3TXfiRMp7kpdwMLM81ks5rsR-hgaJpZM4Ibete
.

Die Frustration ... Ich versuche, navigator.geolocation.getCurrentPosition zu verwenden, aber ich erhalte immer wieder den Fehler:
Zeitüberschreitung bei Standortanfrage. Für Android funktioniert iOS einwandfrei.
Ich habe versucht, enableHighAccuracy auf True / False zu setzen und das dritte Argument zu entfernen. In AndroidManifest wurden sowohl COURSE- als auch FINE-Standortberechtigungen hinzugefügt.

Android SDK 23, Build Tools 25.0.0
Reagiere 16.0.0-alpha.6
RN 0,43,3

Danke für Ihre Hilfe!

Willkommen im Thread Douglas, leider ist getCurrentPosition nicht
zuverlässig auf Android, wie Sie entdeckt haben.
Schauen Sie sich einige der Lösungen weiter oben im Thread an
watchPosition stattdessen

Danke @raldred.
watchPosition scheint zu funktionieren, danke für die Hilfe!

@ Douglaswissett Gern geschehen . Hoffentlich gibt es bald eine robuste Lösung für getCurrentPosition .

Kann ich watchPosition dann clearWatch sofort nach Erhalt der Geoposition verwenden? Ich habe Probleme damit, weil clearWatch nur für componentDidMount aufgerufen werden kann

@pewh ja. Das ist, was ich tue.
Auch navigator.geolocation.clearWatch kann jederzeit aufgerufen werden.
Behalten Sie einfach einen Verweis auf die watchID auf Ihrer Komponente bei, die vom aufgerufenen an watchPosition

Aus den Dokumenten, die ich unter https://facebook.github.io/react-native/docs/geolocation.html gelesen habe, habe ich keine Ahnung, wie ich this.watchID innerhalb von watchPosition Rückruf erhalten kann. Mein Anwendungsfall ist das Auslösen von clearWatch unmittelbar nach Erhalt eines neuen Werts.

@pewh hier ist meine Implementierung. Es ist nicht perfekt, aber es funktioniert.
https://gist.github.com/raldred/b08cf60712eb87d81f05437444dff4ae

@raldred hat Ihre Lösung ausprobiert und die aller anderen, nichts funktioniert

Irgendwelche Lösungen dazu? versuchen Sie alles hier und nichts scheint zu funktionieren, bitte helfen Sie! wenn Sie einige Schnipsel oder etwas teilen können

@ gerard0315 Sie haben einige Erfolge bei der Lösung dieses

Es scheint auf einem echten Android-Handy für mich zu funktionieren

Holen Sie sich Outlook für iOS https://aka.ms/o0ukef


Von: Jorge Almonacid [email protected]
Gesendet: Dienstag, 9. Mai 2017, 14:29:56 Uhr
An: Facebook / React-Native
Cc: Ujwal Setlur; Kommentar
Betreff: Re: [facebook / react-native] Geolocation 'enableHighAccuracy' auf Android läuft immer ab (# 7495)

Irgendwelche Lösungen dazu? versuchen Sie alles hier und nichts scheint zu funktionieren, bitte helfen Sie! wenn Sie einige Schnipsel oder etwas teilen können

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 an oder schalten Sie den Thread https://github.com/notifications/unsubscribe-auth/ stumm.

Ich habe bereits meine Snippets freigegeben, die auf realen Geräten funktionieren
Android 4-7.

Am Dienstag, 9. Mai 2017, 22:29 Uhr schrieb Jorge Almonacid, [email protected] :

Irgendwelche Lösungen dazu? versuche alles hier und nichts scheint zu funktionieren,
bitte helfen! wenn Sie einige Schnipsel oder etwas teilen können

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/AACQ6HSlN8YS_jE6NY9w2vuk7Hv4Wjwfks5r4NrSgaJpZM4Ibete
.

Derzeit ist es nur möglich, ein Update (im Android-Emulator) zu erhalten, wenn Sie alle Parameter (Längengrad, Breitengrad, Breitengrad) gleichzeitig ändern. Wenn Sie nur ein oder zwei ändern - nothing works .

Es gibt einen angeborenen Fehler in der Art und Weise, wie React-Native den Standort auf Android handhabt. (iOS scheint dieses Problem zu fehlen, 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

während

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

In Wirklichkeit benötigen Sie beide / alle Anbieter, wenn Sie einen super präzisen Standort wünschen. Dann möchten Sie Genauigkeit, Zeitstempel vergleichen und den genaueren und aktuelleren Ort akzeptieren.

Es gibt zwei Möglichkeiten, wie Sie dies tun können:

In Reaktion:

Richten Sie zwei watchID Variablen ein -> watchIDGPS und watchIDNetwork . Richten Sie dann zwei Beobachter ein, einen mit enableHighAccuracy=true und enableHighAccuracy=false Dies gibt sowohl den GPS-Anbieter als auch den Netzwerkanbieter zurück (das Netzwerk ist in Innenräumen genauer).

Das Problem mit der React-Methode besteht darin, dass dies im JS-Thread ausgeführt wird. Dies kann Ihre App auf Geräten mit fehlenden Ressourcen einfrieren. Trotzdem funktioniert es.

In Native:

Sie sollten das LocationModule.java als benutzerdefiniertes Modul umschreiben, um Anbieter Ihrer Wahl zu behandeln und den Standort an den mLocationListener unabhängig davon, um welchen Anbieter es sich handelt. Bis React-Native dieses "Problem" behebt.

@ralred , Danke für das Snippet, aber was ist das AndroidPermissions Objekt?

Ich habe alle Lösungen ausprobiert, alle sind fehlgeschlagen ....
Plötzlich erinnerte ich mich, dass meine App ein Kartenmodul, die Baidu-Karte, eine chinesische Karte (map.baidu.com) wie Google Map hat. Sie kann Markierungen und den aktuellen Standort erhalten !!! Endlich habe ich es geschafft ~

Sie können es mit Github, React-Native-Baidu-Map suchen

importieren {
MapView, // die Kartenansicht (brauche ich nicht)
MapTypes, // als 2D oder 3D eingeben (brauche ich nicht)
Geolocation // API über den Standort (ich brauche)
} von 'react-native-baidu-map';

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

Ich weiß nicht, ob es in einem anderen Land funktionieren kann, nur ein Gedanke mit einigen Karten-Apps, Sie können versuchen, native Karten oder andere Karten zu reagieren ...

Nichts funktioniert, watchPosition wird nicht einmal auf Android aufgerufen, iOS funktioniert einwandfrei. Es ist bereits RN v0.45.0 (ich bin derzeit auf 0.44.0) und es ist immer noch nicht gelöst? Komm schon!

@ Rexlow
Nichts funktioniert so gut, ich benutze Version 0.44. Haben Sie versucht, auf v0.45 zu aktualisieren?

@VietDucPhan Es hat gerade funktioniert, völlig zufällig 😓. Immer noch bei 0,44,0

@rexlow Oh gut für dich. Jetzt brauche ich nur noch mein Glück, um mich anzugreifen.

Haben Sie versucht, nur die Optionsstruktur zu entfernen? Das ist das einzige, was für mich funktioniert hat.

Holen Sie sich Outlook für iOS https://aka.ms/o0ukef


Von: viet_duc_phan [email protected]
Gesendet: Sonntag, 18. Juni 2017, 23:26:15 Uhr
An: Facebook / React-Native
Cc: Ujwal Setlur; Kommentar
Betreff: Re: [facebook / react-native] Geolocation 'enableHighAccuracy' auf Android läuft immer ab (# 7495)

@rexlow https://github.com/rexlow Oh, gut für dich. Jetzt brauche ich nur noch mein Glück, um mich anzugreifen.

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-309349488 an oder schalten Sie den Thread https://github.com/notifications/unsubscribe-auth/ stumm.

@rexlow @ ujwal-setlur Ich möchte euch nur wissen lassen, dass mich das Glück getroffen hat. es funktioniert und ist völlig zufällig. Ich habe nichts geändert.

Haben Sie ein echtes Gerät ausprobiert?

Am Dienstag, den 20. Juni 2017 um 19:18 Uhr schrieb viet_duc_phan, [email protected] :

@rexlow https://github.com/rexlow @ ujwal-setlur
https://github.com/ujwal-setlur Ich möchte euch das nur wissen lassen
Glücksschlag auf mich. es funktioniert und ist völlig zufällig. ich habe mich nicht verändert
etwas.

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/facebook/react-native/issues/7495#issuecomment-309843462 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/AACQ6OVyeCsOgd-qevP9CrP9XJMhwaxsks5sGAz3gaJpZM4Ibete
.

@raldred Immer auf realen Geräten getestet.

@VietDucPhan können Sie ein Beispiel

Am Dienstag, den 20. Juni 2017 um 20:52 Uhr schrieb viet_duc_phan, [email protected] :

@raldred https://github.com/raldred Wird immer auf realen Geräten getestet.

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/facebook/react-native/issues/7495#issuecomment-309870269 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/AACQ6N5SVbYeDEeY9FRnTQSrvpLwKL5aks5sGCLmgaJpZM4Ibete
.

@raldred Der ursprüngliche Bericht in dieser Kette enthält ein Code-Snippet:

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

Das scheitert auch bei mir. Die einzige Möglichkeit, das Problem zu beheben, scheint darin zu bestehen, das Optionsargument nicht einzuschließen:

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

@dreallday ist richtig, reagieren native Handles Android-Standort schlecht. Anstatt die beiden Anbieter manuell zu behandeln, ist es jedoch besser, die Fused-API zu verwenden, die Informationen der Anbieter mit Magie kombiniert.

Ich fand React-Native-Fused-Location wirklich nützlich, um Standortanfragen unter Android zu stellen.

@raldred Hallo sorry, habe in letzter Zeit keine E-Mails

@ derman232 Funktioniert React -Native-Fused-Location, wenn die App in den Hintergrund tritt?

@rexlow Entschuldigung, ich weiß die Antwort darauf nicht, keine Funktion, die ich für meine App benötige.

Ich gebe nur meinen Beitrag dazu, wie ich dieses Problem gelöst habe:

  • Das Problem ist, dass für Android> = 6.0 Berechtigungen zur Laufzeit erteilt werden müssen
  • Diese Stackoverflow-Frage enthält weitere Details: Frage
  • Ich habe das PermissionsAndroid-Modul von React Native verwendet, um die Berechtigungen zu erhalten

Jetzt funktioniert alles.

Hallo,
Nichts funktioniert. Ich habe alles versucht.
Bitte beraten.
Danke

Ich würde wirklich gerne helfen, dieses Problem für die Menschen zu lösen.
Wir haben 3 native Apps, die den Standort live nutzen. QA auf über 30 echten Android-Geräten, auf denen Gingerbread bis Nougat läuft.
Alle funktionieren während der Benutzertests einwandfrei. Seitdem haben wir keine Berichte über Probleme von Live-Benutzern erhalten.

@adriancuco Könnten Sie Ihre Implementierung und Ihr Manifest teilen, damit wir versuchen können, weiter zu helfen

  • Version von RN?
  • Mit welchen Android-Versionen haben Sie Probleme?
  • Mit welchen Geräten haben Sie Probleme?

Ihre Implementierung oder Gerätekonfiguration wird kompliziert. Es geht darum, herauszufinden, was das ist.

raldred,

Es tut uns leid. Mein Fehler!
Bevor ich mich umgebracht habe, habe ich mich entschlossen, die Standorteinstellungen auf meinem Telefon zu überprüfen, wie ich vor ein paar Tagen gelesen habe, und es war nur GPS aktiviert. ; (
Also habe ich GPS, Wifi usw. und alles aktiviert und jetzt funktioniert es einwandfrei.
Schätze es wirklich.
Vielen Dank

Gibt es ein Update zu diesem Problem?

Immer noch keine Lösung.


Von: adriancuco [email protected]
Gesendet: Dienstag, 4. Juli 2017, 14:44:28 Uhr
An: Facebook / React-Native
Cc: Marouen SAYARI; Kommentar
Betreff: Re: [facebook / react-native] Geolocation 'enableHighAccuracy' auf Android läuft immer ab (# 7495)

raldred,

Es tut uns leid. Mein Fehler!
Bevor ich mich umgebracht habe, habe ich mich entschlossen, die Standorteinstellungen auf meinem Telefon zu überprüfen, wie ich vor ein paar Tagen gelesen habe, und es war nur GPS aktiviert. ; (
Also habe ich GPS, Wifi usw. und alles aktiviert und jetzt funktioniert es einwandfrei.
Schätze es wirklich.
Vielen Dank

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-312881724 an oder schalten Sie den Thread https://github.com/notifications/unsubscribe-auth/ stumm.

@ m-sayari du wirst uns ein bisschen mehr Informationen geben, um zu helfen.

  • RN-Version
  • Android Build Zielversion
  • Android-Geräteversion
  • Geräte, auf denen dieses Problem auftritt.

Sie sind spezifisch für Ihre Implementierung / Einrichtung und verursachen das Problem. Wie bereits erwähnt, funktioniert es problemlos in mehreren Live-Apps.

Hier gelöst! RN 0.45.1 mit einem Redmi 4A mit Android 6.

Ich hatte dieses Problem beim Aufrufen von navigator.geolocation.getCurrentPosition () in componentDidMount ()
Anstelle von getCurrentPosition rufen Sie einfach watchPosition () mit denselben Parametern auf.

@raldred
RN-Version
0,46
Android Build Zielversion
api 22
Android-Geräteversion
6.0.1
Geräte, auf denen dieses Problem auftritt.
Nexus 5

Das Aufrufen von getCurrentLocation ohne den dritten Parameter 'options' löst mein Problem. Es funktioniert bei mir nicht, wenn Sie 'enableHighAccuracy' auf false setzen

Hallo @raldred , das gleiche Problem wie bei anderen, die über RN

  • RN-Version: 0,47
  • Die auf den RN-Standardeinstellungen verbleibende Android Build-Zielversion:
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
  • Android-Geräteversion: 6.0.1, 7.0
  • Geräte, auf denen dieses Problem auftritt:

    • Nexus 5 mit Android 6.0.1

    • Xiaomi Redmi 3S mit Android 6.0.1

    • Android Emulator mit Android 7.0

getCurrentPosition funktioniert einwandfrei, wenn ich in den Geräteeinstellungen den Standortmodus "Nur Gerät" einstelle, aber nicht mehr funktioniert ( Location request timed out ), wenn der Modus auf "Hohe Genauigkeit" eingestellt ist.

Ich muss den dritten Parameter weglassen, damit getCurrentPosition zumindest im Nur-Gerät-Modus funktioniert:

    navigator.geolocation.getCurrentPosition(setLocation);

Ich nahm dies an und es funktionierte für mich, habe aber nicht mit einem anderen Fall getestet.
Als ich mir meine Optionen ansah, stellte ich fest, dass es zwei Elemente gab, die sich selbst widersprachen: maximumAge und enableHighAccuracy . Ich denke, diese beiden Optionen sind auf etwas unterschiedliche Weise gleich, während das maximale Alter sicherstellt, dass Sie Erhalten Sie die neueste Geolokalisierung basierend auf Ihren Einstellungen, obwohl die Genauigkeit gering ist. enableHighAccuracy stellt sicher, dass Sie den aktuellsten und genauesten Standort erhalten. Ich hatte das gleiche Problem mit den folgenden Optionen.
{enableHighAccuracy: true, timeout: 20000, maximumAge: 60000} bis ich das maximale Alter entfernt und enableHighAccuracy hoffe das hilft jemandem.

Ich habe gerade React-Native vom Master erstellt, um zu testen, ob Commit 7e11bad86fd21ce1a8408218e66ce85993d9db69 dieses Problem behebt. Leider erhalte ich immer noch den gleichen Fehler wie zuvor.

Die @ olieidel Watch-Position funktioniert tatsächlich.

@olieidel Mit der folgenden API, PermissionsAndroid , können Sie überprüfen, ob Ihre App Zugriff auf Standortberechtigungen hat. Sie würden dies zuerst überprüfen und dann fragen, ob es nicht gewährt wird.

@ Mrbarde danke für die schnelle Antwort!

Ah, nach einem ganzen Tag des Debuggens sind hier meine Ergebnisse und eine relevante Problemumgehung:
RN 0.46.4, Gerät: Nexus 5X, API 25

Standortmodus: Nur Gerät

  • getCurrentPosition , enableHighAccuracy: true : Funktioniert, wenn ein GPS-Signal verfügbar ist, andernfalls eine Zeitüberschreitung
  • getCurrentPosition , enableHighAccuracy: false : funktioniert nicht (Timeout). benötigt wahrscheinlich Ortungsdienste (Ortungsmodus! = nur Gerät).
  • watchPosition , enableHighAccuracy: true : Funktioniert, wenn ein GPS-Signal verfügbar ist, andernfalls eine Zeitüberschreitung
  • watchPosition , enableHighAccuracy: false : funktioniert nicht

Standortmodus: Hohe Genauigkeit

  • getCurrentPosition , enableHighAccuracy: true : Funktioniert, wenn ein GPS-Signal verfügbar ist, andernfalls eine Zeitüberschreitung. Abhängig von Ihrer Einstellung maximumAge ein älterer Speicherort zurückgegeben werden.
  • getCurrentPosition , enableHighAccuracy: false : funktioniert nach 5-6s (wie bereits berichtet).
  • watchPosition , enableHighAccuracy: true : Funktioniert, wenn ein GPS-Signal verfügbar ist, andernfalls eine Zeitüberschreitung
  • watchPosition , enableHighAccuracy: false : funktioniert

Zusammenfassung
Wenn Ihr Standortmodus nur Gerät ist, sollten Sie immer ein GPS-Signal erwarten. In allen anderen Fällen benötigen Sie Ortungsdienste (Ortungsmodus! = Nur Gerät).
Ich nehme an, dies ist alles das erwartete Verhalten der Standort-API, und ich habe gerade festgestellt, dass das Äquivalent der Erde nicht flach ist. Dies ist jedoch die Hölle zum Debuggen, wenn Sie ein Gerät mit dem Standortmodus eingerichtet haben == Nur Gerät (an Emulator, ein neu konfiguriertes Gerät) und Sie sitzen in einem Raum, in dem kein GPS-Signal verfügbar ist. In diesem Fall erhalten Sie nur Zeitüberschreitungen.

Problemumgehung
Wie bereits in diesem Thread beschrieben, habe ich auch zwei watchPosition Listener mit unterschiedlichen Werten für enableHighAccuracy und einfach den ersten Wert von beiden genommen und sie dann entfernt. Als ich mit diesem Ansatz herumspielte, hatte ich den Eindruck, dass beide Hörer tatsächlich dieselben Speicherorte zurückgeben, aber meine Debugging-Toleranz für den Tag ist erschöpft ...
Dies setzt voraus, dass Ihr Standortmodus nicht nur Gerät ist.

@olieidel Sicher, und ich frage mich, warum niemand die native Geolocation-API direkt verwendet. Wenn sie nicht nützlich ist oder einfach nicht funktioniert, wäre es meiner Meinung nach angebracht, sie durch die navigator.geolocation zu ersetzen, da dies funktioniert Wunder, versuchen Sie, eine Pull-Anfrage mit Ihrer Problemumgehung zu stellen, um zu sehen, ob es Facebook gefällt. Und danke, dass Sie sich die Mühe gemacht haben, tiefer zu graben.

Ich habe eine Weile gebraucht, um dieses Problem konsequent zu reproduzieren.

Ich habe dieses Problem nur auf Samsung-Handys mit Android 5.1 und 6.0, wenn der Standortmodus auf "Hohe Genauigkeit" eingestellt ist und die aktuelle Positions-API verwendet wird, während Sie sich in Innenräumen ohne GPS-Signal befinden. Es funktioniert gut auf Oppo-Telefonen oder im Freien mit klarem GPS-Signal, selbst wenn der Modus "Hohe Genauigkeit" aktiviert ist.

Ich werde in Kürze einige der in diesem Thread vorgeschlagenen Lösungen testen.

@mrbarde nur um zu verdeutlichen: Ich habe navigator.geolocation . :) :)

@olieidel Ich weiß, ich navigator.geolocation und nicht die Geolocation- API widerspiegeln sollte.

Hallo Leute, ich habe festgestellt, dass Sie unter Android möglicherweise die Berechtigung haben, auf den Standort zuzugreifen, aber der Benutzer hat den Standort in den Betriebssystemeinstellungen deaktiviert. Wenn Sie also navigator.getCurrentPosition() anrufen, tritt immer noch eine Zeitüberschreitung auf.

Hier ist ein Java-Snippet mit zwei Methoden. checkIfLocationAvailable prüft, ob der Standort des Benutzers in den Einstellungen aktiviert ist oder nicht. requestUserToActivateLocation fordert den Benutzer auf, den Standort einzuschalten.

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");
        }
    }
}

Seit ich damit angefangen habe, hatte ich keine Probleme mit dem Standort mit Android. Hoffentlich hilft es jemandem.

Natürlich müssen Sie compile 'com.google.android.gms:play-services-location:x.x.x' zu Ihrem app/build.gradle hinzufügen und ein natives Modul erstellen, wie hier beschrieben. Ich bin mir nicht sicher, ob dies ausreicht, um eine eigenständige npm-Bibliothek zu erstellen.

Hallo @nigelnindo, es gibt tatsächlich eine React Native API namens PermissionsAndroid .
Sie können überprüfen, ob der Benutzer die Standortberechtigung für die App aktiviert hat
Ich hatte das gleiche Problem, auf das Sie hingewiesen haben. Was ich getan habe, um das zu lösen, war das Folgende.

Ich habe zuerst überprüft, ob der Benutzer der App Zugriff auf den Gerätestandort gewährt hat

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

Und dann eine Funktion mit dem folgenden Code ausgelöst, wird der Benutzer dazu aufgefordert
Gewähren Sie Standortzugriff auf die App.

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
});

Das hat den Trick für mich getan und jetzt habe ich keine Standortprobleme mehr, hoffe das hilft jemandem da draußen.

Hallo @mrbarde , nur um es hinzuzufügen, ich benutze die PermissionsAndroid Bibliothek zusätzlich zu dem obigen Snippet. Wie ich bereits erwähnte:

Hallo Leute, ich habe festgestellt, dass Sie unter Android möglicherweise die Berechtigung haben, auf den Standort zuzugreifen, aber der Benutzer hat den Standort in den Betriebssystemeinstellungen deaktiviert.

Mit anderen Worten, Ihre App kann die Berechtigung haben, auf den mit PermissionsAndroid erhaltenen Standort zuzugreifen. Wenn der Benutzer den Standort jedoch entweder über die Verknüpfungen in der Statusleiste deaktiviert hat oder auf Settings -> Location -> Off die getCurrentPosition() call läuft immer noch ab. Dies hilft bei diesem Randfall.

@nigelnindo yh in diesem Fall dann werde ich wirklich Ihre Lösung vorschlagen, ist es Ihnen möglich, eine PR damit zu machen? Ich meine, es könnte wirklich viel Zeit sparen. Ich verwende ein externes Paket, um dies zu handhaben, da ich kein Java schreiben kann, obwohl ich mir wirklich wünschte, ich hätte die Zeit, es zu lernen. Wenn dies offiziell in React war, würde ich das vorziehen. Ich werde skeptisch, wenn ich mich für wirklich wichtige Dinge wie diese auf Bibliotheken von Drittanbietern verlasse. Ich mache mir Sorgen um die Konsistenz.

Versuchen Sie, (Android) TargetSdkVersion auf build.gradle (App) unter 23 (16-22) zu ändern. und es wird funktionieren!

weil wir die Berechtigung aus der AndroidManifest-Datei benötigen. und AndroidManifest-Datei nur im SDK unter 23 (16-22) aufgerufen.

und vergessen Sie nicht hinzuzufügen:

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

MaxAge-Parameter nicht löschen!

In diesem Fall gibt das GPS-Modul das zuletzt zwischengespeicherte Ergebnis zurück, bis die tatsächliche Position von den Satelliten ermittelt wurde. Möglicherweise wird die Position in einer anderen App zwischengespeichert, die weit von Ihrer tatsächlichen Position entfernt ist. Und wenn Sie versuchen, eine Spur zu speichern, zeigen Ihre ersten Punkte möglicherweise eine Position an, die weit von Ihrer tatsächlichen Position entfernt ist.

@pavelpashkovsky Können Sie einige Fakten oder offizielle Dokumente zeigen, um Ihre Behauptung zu

@rexlow Ich habe gerade das Ergebnis meiner Tests beschrieben, weil ich vor ungefähr einer Woche mit dem gleichen Problem konfrontiert war und dieses Thema gefunden habe.

Ich hatte ungefähr 30 Tests. Und ich habe 3-4 Fälle mit falscher Position in den ersten 1-5 Sekunden (bis GPS das Satellitensignal gefunden hat)

@pavelpashkovsky Ich stehe jetzt auch vor dem gleichen Problem. Obwohl ich maximumAge: 1000 in meiner Konfiguration habe. Es sieht so aus, als würde der vorherige Speicherort zwischengespeichert, wie Sie gesagt haben.

@ Rexlow Du hast recht. In Ihrem Fall hält GPS die Position 1 Sekunde lang.

Aber das beste Ergebnis, das ich mit MaximumAge erzielt habe: 0, wenn GPS keine Ergebnisse speichert und immer versucht, die tatsächliche Position zu ermitteln (oder Fehler, wenn die Position nicht von Satelliten abgerufen werden kann).

Ich kann bestätigen, dass das Entfernen des Maximums Probleme mit dem Oppo-Telefon verursachen kann, das ich auch getestet habe. Es wird sehr alter Cache verwendet.

Es passierte mir die ganze Zeit. Es stellte sich heraus, dass meine Geolocation-Berechtigung unter App-Info -> Berechtigungen deaktiviert wurde. Ich frage mich, warum das passiert ist, aber es scheint, dass diese Berechtigungen diejenigen überschreiben, die wir zur Laufzeit anfordern. Vielleicht hat auch jemand anderes dieses Problem

Hallo (Entschuldigung für mein Englisch).
Ich denke, eine Erhöhung von MaximumAge wird das Problem lösen.

RN 0.48 Geolocation doc:
Die Geolocation-API erweitert die Webspezifikation: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation

und von nach:
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy
&
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/timeout
& speziell :
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/maximumAge

in einem Szenario mit diesen Optionen:
{enableHighAccuracy: true, timeout: 10000, maximumAge: 30000}

Der GPS-Chip des Geräts versucht, eine Verbindung zu Satelliten herzustellen. Wenn die Verbindung in der Zeitüberschreitungsperiode (10000 ms) hergestellt wurde, werden Längen- und Breitengrad ohne Fehler zurückgegeben, wie @RoBYCoNTe sagte: issuecomment-220580494, aber wenn die GPS-Verbindung fehlgeschlagen ist oder das Gerät eine zwischengespeicherten Längen- und Breitengrad mit maximalem Alter zurückzugeben Optionen (30000 ms). Wenn etwas vorhanden ist, wird der Fehlercode 3 zurückgegeben, der mit einem Timeout-Fehler im Betreff zurückgegeben wird.

Ich denke, eine Erhöhung des Timeouts (mindestens 25000 ms) für die Verbindung und eine spezielle Erhöhung des MaximumAge (mindestens 3600000 ms = 1 Stunde) ist die beste Lösung!

{enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000} hat bei mir funktioniert

_emulator config_: während Timeout - Zeit sollten Sie virtuelle Standortinformationen (Breitengrad und Längengrad) über Location - Menü in Emulator Einstellungen senden. (Dies emuliert die Satellitenverbindung)

{ enableHighAccuracy: true, timeout: 60000, maximumAge: 1200 } hat bei mir funktioniert. Für mich ging es nicht um das Höchstalter, sondern um die Zeit, die ich warten wollte.

(Nur Android)
Dieses Problem ist meiner Meinung nach kein Fehler.
In React Native funktioniert die Geolokalisierung wie folgt:

  • Hohe Genauigkeit bedeutet GPS-Standort
  • Wenn deaktiviert, wird der Standort vom Netzwerkanbieter abgerufen
  • Mit MaximumAge können Sie nicht jedes Mal eine neue Position abrufen (was batterie- und zeitaufwändig ist), sondern sich auf eine zwischengespeicherte Position verlassen

Grundsätzlich ist der GPS-Anbieter langsamer als der Netzwerkanbieter und funktioniert je nach Standort nicht immer (wenn GPS das Telefon nicht erreichen kann, tritt eine Zeitüberschreitung auf). Der Netzwerkanbieter ist schneller und zugänglicher, aber als Kompromiss ist die Genauigkeit gering (das Schlimmste, das ich hatte, waren 2000 Meter).

Wenn Sie mit highAccuracy eine Zeitüberschreitung haben, bedeutet dies, dass Sie nicht über GPS erreichbar sind.
In diesem Fall sollten Sie es standardmäßig deaktivieren und den Speicherort aktualisieren, wenn er immer genauer wird. Ihre Benutzer werden in diesem Fall nicht warten.

In meinem Fall habe ich meine eigenen Beobachter implementiert, den Standort verglichen und immer die genaueren zurückgegeben. Das Problem bei der Standard-RN-Implementierung besteht darin, dass sie entweder auf dem GPS-Anbieter oder dem Netzwerkanbieter basiert, aber keinen Kompromiss zwischen beiden zurückgibt. Sie müssen es wahrscheinlich entweder auf JS oder Native ausarbeiten.

Hoffe es hat geholfen.

Nur auf Android getestet.

Ich habe es geschafft, dass es in den folgenden Fällen funktioniert und dass der Standort aktiviert ist:

  • Wenn Sie Ihre App über den Android Emulator ausführen, müssen Sie Optionen eingeben, da dies sonst fehlschlägt.
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}
);

Ich verwende nur erweiterte Steuerelemente, um meinen gewünschten Standort an die App zu senden.

  • Wenn Sie Ihre App über echte Mobiltelefone ausführen, müssen Sie Optionen weglassen, da dies sonst fehlschlägt.
navigator.geolocation.getCurrentPosition(
    (position) => {
        this.setState({currentLocation: {lat: position.coords.latitude, lng: position.coords.longitude}})
    }, (error) => {
        alert("Geolocation error: "+error.message);
    }
);

Dadurch erhalten Sie Ihren aktuellen Standort

Wir haben das gleiche Problem!

Gibt es eine Lösung für dieses Problem in naher Zukunft?

Ich habe einige der vorgeschlagenen Lösungen ausprobiert ( Beispiel , Beispiel , Beispiel und Beispiel ), und keine von ihnen hat das Problem gelöst. Aber ich muss sagen, dass ich für das folgende Szenario keine Referenz gefunden habe:

App

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

Nutzungsszenario

Ich erhalte immer noch den Fehler Geolocation timed out, code 3 ...

Hat jemand das gelöst?

_Update_ (2017-11-13):

Ich habe es (zumindest vorübergehend) gelöst, indem ich Settings >> Privacy >> Location >> Mode auf High accuracy

Hallo.
Ich habe eine gute Lösung gefunden!
Bitte lesen Sie zuerst meinen vorherigen Kommentar zu diesem Problem: # issuecomment-331830285

Lösung:
Rufen Sie zuerst navigator.geolocation.getCurrentPosition mit: {enableHighAccuracy: true, timeout: 60000, maximumAge: 0} als PositionOptions , dies gibt die tatsächliche aktuelle Position zurück.
Wenn die vorherige Anfrage abgelaufen ist, rufen Sie navigator.geolocation.getCurrentPosition mit: {enableHighAccuracy: false, timeout: 30000, maximumAge: 3600000} als PositionOptions . Dies gibt die LowAccuracy- Position als Fallback zurück und _ (ich denke) _ hat nie eine
Beispielcode:

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));

Ich hoffe, nützlich zu sein.

Ich habe hier das gleiche Problem!
Ich kann navigator.geolocation nicht auf meinem realen Android-Gerät zum Laufen bringen.

Ich glaube, hier gibt es nichts zu reparieren, die Geolokalisierung funktioniert wie erwartet. Lesen Sie meinen Beitrag oben.

@Rewieer ,

Ich verwende diesen Code, um navigator.geolocation in meiner App zu testen.

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);

Ich bekomme immer ERROR(3): Location request timed out .
mit jeder Kombination von Optionen.
Ich kann den blauen Punkt meiner Position auf der Karte sehen und GPS funktioniert gut, aber ich kann weder die Position noch die navigator.geolocation programmgesteuert verwenden.

Mögliche Probleme sind:

  • schlechte Simulator- / Telefonkonfiguration
  • nicht in einem GPS-abgedeckten Bereich (funktioniert schlecht in Gebäuden oder auf Straßen mit großen Gebäuden zum Beispiel)
  • Auszeiten zu früh

Die Verwendung des Netzwerkstandorts scheint in diesem Fall besser zu funktionieren. Haben Sie versucht, die aktuelle Position ohne Optionen abzurufen? (das würde netzwerkbezogene Infrastruktur verwenden, um die Position zu erhalten)

Ich benutze ein echtes Android-Gerät (Version 5.1)
Ich kann meine Position mithilfe von React-Native-Maps bestimmen (korrekte Position des blauen Punkts auf der Karte in meiner App). + Ich kann die Google Maps-App verwenden und zu meiner Position wechseln (GPS funktioniert).
Ich verwende eine große Zeitüberschreitung und schalte enableHighAccuracy auf true und false um, entferne Optionen ... usw. Alle konnten navigator.geolocation nicht abrufen, um Daten abzurufen.

Haben Sie sich mit der nativen API die Hände auf Android schmutzig gemacht?

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

Ich benutze ein echtes Android-Gerät (Version 5.1)
Ich kann meine Position mithilfe von React-Native-Maps (korrektes Blau) bestimmen
Punkt Position auf der Karte in meiner App) + Ich kann Google Maps App und verwenden
gehe zu meiner Position (GPS funktioniert).
Ich verwende eine große Zeitüberschreitung und schalte enableHighAccuracy auf true und false um.
Optionen entfernen ... etc. Alle konnten navigator.geolocation nicht abrufen
Daten.

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/facebook/react-native/issues/7495#issuecomment-344935653 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/ALuPm5XL1tNLCniOMR4YAMI4ZC2fKxrsks5s3ESBgaJpZM4Ibete
.

Ja @Rewieer , ich bin damit einverstanden. Die Fehlerursache sind schlechte Konfigurationen.

Im Emulator müssen wir vor dem Timeout Breiten- und Längengrade über die Emulatoreinstellung senden!

Meine Lösung # issuecomment-331830285 versucht zunächst, die tatsächliche aktuelle Position über GPS und Satellitenverbindung zu ermitteln. Wenn das niedrige Genauigkeit zu ermitteln .

@Rewieer Ich habe nie mit Android native API gearbeitet. Ich mache nur JavaScript-Entwicklung.

@badis bitte senden Sie Ihren Code und Fehlerprotokoll.

@ Badis
RN Doc:
Um den Zugriff auf den Speicherort anzufordern, müssen Sie der AndroidManifest.xml Ihrer App die folgende Zeile hinzufügen:

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

Wenn Sie mit React-Native arbeiten, sollten Sie etwas über die zugrunde liegende native Umgebung wissen, da mir solche Probleme bei der Arbeit mit React-Native sehr häufig vorkommen.
Der beste Weg (benutzerbezogen) besteht darin, zu Beginn eine Annäherung abzurufen und diese zu korrigieren, da GPS abhängig von Ihrer Position und der Position von Satelliten in der Nähe einige Zeit in Anspruch nehmen kann. Ich weiß, dass der Standort des Netzwerks sehr rau erscheint, aber ich denke, nicht jeder lebt in San Francisco :)

@Rewieer @hoorsa
Hier ist ein Demo-Code, in dem ich Funktionen teste :
Schauen Sie sich die Kartenseite an.
Ich möchte nur wissen, ob der Code korrekt ist und für jemand anderen funktioniert.
Danach werde ich auf meiner Seite versuchen, festzustellen, ob das Problem in meinen Geräteeinstellungen und meinem Standort liegt.

Danke euch allen !

@badis hast du <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> zur AndroidManifest.xml deiner App hinzugefügt?

@ Badis Ich hatte gestern das gleiche Problem. Es funktioniert, wenn Sie einfach das letzte Argument entfernen (ich verstehe, dass es nicht ideal ist), wie in https://github.com/facebook/react-native/issues/7495#issuecomment -228730196 vorgeschlagen

Was sind die Standardoptionen für Android? Vielleicht könnte das helfen, dieses Problem zu lösen

Ich denke, wir verwenden diese Standardeinstellungen (aus der Überprüfung von LocationModule.java):

{
enableHighAccuracy: false, // Verwenden Sie kein GPS
MaximumAge: Double.POSITIVE_INFINITY, // Akzeptiere jeden zwischengespeicherten Speicherort
Zeitüberschreitung: Long.MAX_VALUE,
distanceFilter: 100
}}

Außerdem tritt der gleiche Standortfehler auf. Das Deaktivieren des Parameters für die dritte Option funktioniert für die Modi "Hohe Genauigkeit" und "Batteriesparen". Dennoch fällt jedes Mal nur das Gerät aus. enableHighAccuracy to true schlägt fehl, unabhängig davon, auf welchen Modus wir das Gerät eingestellt haben.

Verwendet dieses Ding überhaupt

Das Deaktivieren des dritten Optionsparameters funktioniert für die Modi "Hohe Genauigkeit" und "Batteriesparen".

@mkpietrzyk also das Weglassen von options es für Sie in diesen beiden Modi gelöst?

@natterstefan

Ja, für Android habe ich Standardparameter verwendet ... aber ein nahezu unbegrenztes Timeout und MaximumAge für meine App zu haben, ist ein Appkiller, da ich wissen muss, wo meine Benutzer einige Bedingungen überprüfen müssen.

Wenn Sie hier die @ hoorsa- Lösung verwenden,

Ich habe das gleiche Problem, bei dem ich das Zeitlimit auf eine lächerlich hohe Zeit einstellen muss, damit es funktioniert, aber die Benutzer müssen früher auf die Informationen zugreifen. Beim ersten Erstellen der App kann ich innerhalb einer halben Sekunde protokollieren, dass die Berechtigungen für den Zugriff auf Fine Location gültig sind. Die Implementierung von Fine Location funktioniert unter Android einfach nicht richtig.
Als Referenz habe ich es mit / ohne Parameter versucht. Auch ohne zusätzliche Optionen kann der Speicherort manchmal nicht geladen werden. Die Tests wurden mit einem One Plus One durchgeführt

Ich habe auch dieses Timeout-Problem.

RN .50.3

Versucht, Aufruf der API mit und ohne den Parameter maximumAge:

{enableHighAccuracy: true, Zeitüberschreitung: 10000},

Ich verpacke diesen Anruf auch mit einer Berechtigungsanfrage, damit dies kein Problem darstellt:

PermissionsAndroid.request (
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,

Der Modus für hohe Genauigkeit ist auf dem Gerät aktiviert.
Manifest hat korrekte Berechtigungen.

Auf meinem Galaxy S7 wird ein Standort in Ordnung aufgelöst.
Auf meinem Pixel 2 tritt nach dem 10-Sekunden-Timeout an einem Ort ohne GPS-Signal eine Zeitüberschreitung auf.
Auf dem Emulator - es tritt eine Zeitüberschreitung nach dem 10-Sekunden-Timeout auf, es sei denn, ich gehe zur Registerkarte Standort in den erweiterten Steuerelementen und klicke auf SENDEN, um einen Standort zu senden.

Es scheint, dass navigator.geolocation.getCurrentPosition NICHT funktioniert, wenn kein GPS-Signal vorhanden ist, selbst wenn ein älterer Standort von einer anderen Anwendung zwischengespeichert wurde, die zuvor den Standort verwendet hat.

Ich werde dies umgehen, indem ich eine hohe Genauigkeit versuche und dann zu keiner hohen Genauigkeit @olieidel fehlschlägt.

Ich habe das gleiche Problem wie @jacksontbryan, aber getCurrentPosition eine im Cache gespeicherte Position nicht verwenden , wenn maximumAge weggelassen.

Es scheint gut auf einem Galaxy S7 zu funktionieren, aber nicht auf meinem LG G6. Auf dem LG tritt fast immer eine Zeitüberschreitung auf, wenn MaximumAge eingestellt ist. Wenn MaximumAge nicht festgelegt ist, wird ein alter Speicherort verwendet.

Bearbeiten: Es scheint, als würde das Weglassen des Optionsarguments insgesamt funktionieren.

Ich empfehle jedem, eine eigene native Modulimplementierung unter Android zu verwenden, um stabile Ergebnisse zu erzielen. Die Implementierung ist recht einfach, Sie erhalten viel mehr Kontrolle über GPS und müssen sich keine Sorgen machen, dass Ihre App auf einigen Geräten nicht funktioniert.

    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 Ich versuche, ein natives Modul für Ihr Snippet zu erstellen, aber ich kann es nicht zum https://gist.github.com/pewh/1fd64c8f0b3797ef2b7a7046b5a5f974 veröffentlicht und hoffe, dass jemand freundlicherweise mein Gist überarbeitet. Vielen Dank und frohe Weihnachten!

Das Aufrufen von navigator.geolocation.getCurrentPosition ohne Optionen löste das Problem für mich. Ich übergebe nur Erfolgs- und Fehlerrückrufe.

Getestet auf einem realen Gerät mit Android 5.1.

@ginex Sind Sie sicher, dass die Daten neu sind? Wenn ich das mache, bekomme ich manchmal stundenlange Daten. (Es heißt, ich bin dort, wo ich vor einer Stunde war).

Das muss wirklich behoben werden!

Hallo

Ich stehe auch vor dem gleichen Problem. Bei einigen Geräten wird ein Timeout-Fehler angezeigt. Ich habe das Timeout von 2 Sekunden auf 10 Minuten erhöht, aber ohne 10 Minuten zu warten, wird mir nur der Fehler angezeigt.

Ich habe es auch mit enableHighAccuracy versucht: false. In diesem Fall kann ich den Standort ermitteln (außer im Gerätemodus).

Ich habe es auch versucht, ohne die Parameter zu übergeben. Ich kann den Standort auch in diesem Fall abrufen, außer im Gerätemodus.

Ich habe auch versucht, MaximumAge zu übergeben, aber kein Ergebnis.
Das ist mein Code-

getCurrentPosition () {
navigator.geolocation.getCurrentPosition (
(Position) => {
console.log ('Position abrufen');
this.location = {
Längengrad: position.coords.longitude,
Breitengrad: position.coords.latitude,
Fehler: null,
};
},
(Fehler) => {
console.log ('Positionsfehler abrufen', Fehler);
this.location = {
Längengrad: null,
Breitengrad: null,
error: error.message,
};
},
{
enableHighAccuracy: true,
Zeitüberschreitung: 600000
},
);
}}

Wenn einer von Ihnen skipPermissionsRequest verwendet und geoLocation eine Zeitüberschreitung aufweist, siehe # 17487

Hallo

@ngandhy - Nein, ich verwende nicht 'skipPermissionRequests': true. und minSdkVersion ist 16

Ich habe die gleichen Probleme wie Sie alle, habe jede Kombination ausprobiert, die Leute für Android erwähnen, und sie mit dieser Geolokalisierung mit reaktivem

@ Badis
Ihre Lösung hat bei mir funktioniert - danke!

Meine Methode vor dem Fix:

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

Meine Methode nach Ihrem Fix:

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

Ich teste nur diesen Code und es könnte eine Lösung sein:
https://www.abidibo.net/blog/2017/11/23/geolocation-react-native/

Hat auch dieses Problem jemand eine Lösung?

Ich habe dieses Problem schon eine Weile und die einzige "Lösung", die konsistent funktioniert, ist das Deaktivieren von "enableHighAccuracy". Das Problem dabei ist, dass es dann Ihr Netzwerk anstelle von GPS verwendet, um Ihren Standort zu bestimmen, was eine Menge Genauigkeit verliert.

Viele der anderen Lösungen scheinen zunächst zu funktionieren, aber ich habe festgestellt, dass dies normalerweise auf die Verwendung einer zwischengespeicherten Position zurückzuführen ist. Wenn Sie Ihr Telefon neu starten und Ihre App starten, schlägt dies immer noch fehl.

Heute habe ich dieses Paket gefunden, das Googles API für fusionierte Standorte für Android-Standorte verwendet und auf die Standardimplementierung von React Native für iOS zurückgreift (ich bin nicht der Autor dieses Pakets, aber ein großes Lob an ihn für die Erstellung):

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

Ich habe es bisher nur ein bisschen getestet, aber es scheint gut zu funktionieren.

@globetro Danke! Ich habe das auch überprüft und scheint gut zu funktionieren!

@globetro Danke.
React-Native-Geolocation-Service ist die beste Lösung.

@globetro Ich hatte auch Erfolg mit diesem Plugin. Dies sollte in React-Native als Standard-Geolocation-Funktionalität zusammengeführt werden!

React-Native-Geolocation-Service hilft mir nicht :(

Dank @globetro hat das Paket * react-native-geolocation-service * perfekt funktioniert. Es sollte schön sein, dies als Kernkomponente für react native hinzuzufügen.

Sie möchten wirklich zwei Standort-Listener haben (was teuer ist), einen mit hoher Genauigkeit und einen mit hoher Genauigkeit.

Dann möchten Sie vergleichen, was genauer und neuer ist als Ihr 'aktueller' Standort.


Dies ist eine 'temporäre' Lösung, die wirklich auf der RN-Seite implementiert werden sollte, sodass sowohl COARSE- als auch FINE-Berechtigungen verwendet werden, wenn highAccuracy aktiviert ist.

Ich habe dieses Problem behoben. Hier ist die Komponente, die ich mit einem Versprechen erstellt habe:
https://gist.github.com/a3diti/5466f7309752cbb2e63ecefff6365bb9
In Android entfernte ich maximumAge , behielt enableHighAccuracy bis true und fügte eine Berechtigungsprüfung von RN PermissionsAndroid .

@ a3diti Hast du es in der realen Welt getestet? Der Speicherort kann zwischengespeichert werden.

@ a3diti Solange sie in der neuesten

Warum nicht den hier verwendeten Code https://www.npmjs.com/package/react-native-geolocation-service in Core zusammenführen?

Ich habe das gleiche Problem mit "Zeitüberschreitung anfordern". Nach F & E versuche ich, das Gerät neu zu starten, nachdem ich den Standort und die Funktionsweise erhalten habe.

Bitte überprüfen Sie meinen Code.

componentDidMount = () => {
navigator.geolocation.getCurrentPosition (
(Position) => {
const initialPosition = JSON.stringify (Position);
this.setState ({initialPosition});
},
(Fehler) => alert (error.message),
{enableHighAccuracy: false, Zeitüberschreitung: 20000, MaximumAge: 1000, distanceFilter: 1}

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

  });

}}

Jeder Grund, warum die Leute immer noch damit kämpfen und es nicht benutzen

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

wie vorher vorgeschlagen? Es funktioniert perfekt für mich.

Funktioniert es nicht für andere?

Dies wurde der Datei AndroidManifest.xml hinzugefügt und es funktioniert!

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

Hallo Leute,

Ich habe versucht, den von @globetro vorgeschlagenen -Native-Geolocation-Service zu verwenden, aber meine App stürzt sofort ab. Irgendwelche Ideen?

@ Patrick-Bayer Ich verwende es in meiner App bei Google Play, wo es funktioniert, aber meine Entwicklungsversion stürzt jetzt aus einem unbekannten Grund sofort ab. Es scheint ein React-Native-Geolocation-Service zu sein, der auch für mich den Absturz verursacht.

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

Lassen Sie mich wissen, wenn Sie eine Lösung finden.

@oakis Die folgenden Schritte haben bei mir funktioniert:

  1. Aktualisieren Sie Gradle und ändern Sie die Version in
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. Fügen Sie "google ()" zu den Repositorys in Ihrem android / build.gradle hinzu

Manchmal funktioniert es auch nach dem Hinzufügen von <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> zu Ihrer AndroidManifest.xml immer noch nicht.
Schnelle Problemumgehung

  1. Sie können explizit nach den Standortinformationen des Benutzers fragen, wenn dieser den ersten Bildschirm Ihrer App auf diese Weise bereitstellt
    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. Setzen Sie niemals enableHighAccuracy auf falsch, sondern entfernen Sie stattdessen maximumAge und erhöhen Sie Ihre timeOut . So etwas wie {enableHighAccuracy: true, timeout: 100000,} würde reichen.

Ich hoffe das wird jemandem helfen.

Für mich funktioniert das Setzen von enableHighAccuracy auf true unter API 23, obwohl ich unter API 26 auf false setzen muss.
(Es sind die einzigen, an denen ich teste)

BEARBEITEN: Am Ende habe ich den React -Native-Geolocation-Service installiert und das hat meine Probleme gelöst 🥁

Hallo,

Ich hatte das gleiche Problem und hier ist eine andere Lösung.

Ich habe das folgende uses-feature -Tag in AndroidManifest.xml hinzugefügt und es scheint, dass die App mit highAccuracy: true funktioniert

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

Wenn Sie highAccuracy: high festlegen, verwendet React Native anscheinend GPS_PROVIDER anstelle von NETWORK_PROVIDER. Und wie das Dokument der Android-Entwickler besagt, muss eine App, die auf API 21 oder höher abzielt, dieses Tag in AndroidManifest.xml enthalten, um GPS_PROVIDER verwenden zu können.

Achtung: Wenn Ihre App auf Android 5.0 (API-Stufe 21) oder höher abzielt, müssen Sie deklarieren, dass Ihre App die Hardwarefunktion android.hardware.location.network oder android.hardware.location.gps in der Manifestdatei verwendet, je nachdem, ob Ihre App empfängt Standortaktualisierungen von NETWORK_PROVIDER oder von GPS_PROVIDER. Wenn Ihre App Standortinformationen von einer dieser Standortanbieterquellen empfängt, müssen Sie deklarieren, dass die App diese Hardwarefunktionen in Ihrem App-Manifest verwendet. Auf Geräten, auf denen Versionen vor Android 5.0 (API 21) ausgeführt werden, enthält das Anfordern der Berechtigung ACCESS_FINE_LOCATION oder ACCESS_COARSE_LOCATION eine implizite Anforderung für Standorthardwarefunktionen. Das Anfordern dieser Berechtigungen fordert jedoch nicht automatisch Standorthardwarefunktionen unter Android 5.0 (API-Stufe 21) und höher an.

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

Ich weiß nicht, warum Sie android.hardware.location.network in AndroidManifest.xml aufnehmen müssen, wenn Sie highAccuracy: false festlegen, was impliziert, dass LocationManager NETWORK_PROVIDER verwendet und das Tag daher gemäß dem Dokument erforderlich ist.

Hoffe, diese Lösung funktioniert für Sie.

Ich habe einige Experimente durchgeführt und es scheint, dass das Zeitlimit damit zu tun hat, ob die Ortungsdienste von Google auf dem Gerät aktiviert sind.
Ich habe festgestellt, dass Sie beim Einschalten der Ortungsdienste auf dem Gerät in einer Warnmeldung gefragt werden, ob Sie die Standortgenauigkeit verbessern möchten. mit einem Text, der erklärt, dass die Standortdienste von Google im Hintergrund ausgeführt werden und auch Standortdaten an Google senden. Dies geschieht normalerweise auf einem neuen Gerät oder einem Emulator, da die meisten von uns dies bereits auf ihren regulären Geräten aktiviert haben.

9vgfb

Wenn dies nicht aktiviert ist, muss das Gerät fast jedes Mal einen neuen Standort erhalten, wenn Sie danach fragen (gesteuert durch die Einstellungen maximumAge ). Wenn Sie eine Weile nicht nach dem Standort gefragt haben und der timeout nicht ausreicht, um einen neuen Standort zu erhalten, gibt der navigator.geolocation.getCurrentPosition nur eine Zeitüberschreitung zurück.

Ich habe auch gesehen, dass dies behoben wurde, indem Google Maps einmal auf dem Gerät geöffnet wurde (wodurch wieder ein neuer Standort angezeigt wird).

Wiederum nicht behaupten, dass dies die richtige Erklärung / Lösung ist, sondern nur meine Beobachtungen zu diesem Thread hinzufügen

Ich konnte auf Android nur nach Standortänderungen mit reaktionsnativem fusioniertem Standort suchen

Hat jemand Interesse daran, die Änderungen von einem der vorgeschlagenen Module in den Kern zu übertragen?

Vor einigen Tagen habe ich React-Native-Cross-Geolocation veröffentlicht , das mit dem RN-Geolocation-Modul kompatibel ist, aber die effizienteste Google Location-API für Android verwendet. Aus diesem Grund denke ich nicht, dass mein Modul ein Kandidat für die Integration in den RN-Kern ist, aber es steht jedem zur Verfügung, der es verwenden möchte.

React-Native-Geolocation-Service Dieses Paket verwendet eine fusionierte Standort-API und funktioniert einwandfrei, um die Position zu ermitteln oder sogar die Position zu überwachen. @hramos und @reyalpsirc bitte

Der fusionierte Standort von

Ich habe fast alles versucht und es stellte sich heraus, dass es inkonsistent ist. Ich habe etwas gefunden, das nützlich sein könnte.

Um eine hohe Genauigkeit zu erzielen, muss der Standort über das GPS + -Netzwerk (Carrier Services) gefunden werden. Beim Überprüfen der Berechtigungen auf App-Ebene waren auf meinem Gerät die Standortberechtigungen der Netzbetreiberdienste deaktiviert. Das Aktivieren und Entfernen des dritten Parameters aus navigator.geolocation.getCurrentPosition () funktioniert bei mir.
Versuchen
- Wechseln Sie zu den Einstellungen Ihres Geräts -> Sicherheit und Standort -> Standort -> Berechtigungen auf App-Ebene
- Aktivieren Sie die Standortberechtigung für Carrier Services
-Entfernen Sie die Speicherortkonfiguration (dritter Parameter) aus getCurrentPosition
-Starten Sie Ihr Gerät neu

Hoffe das hilft!

Ich bin mir nicht sicher, ob es relevant ist. Aber ein Beispiel für https://snack.expo.io/SkJqg8gYm. Nach dem Anpassen des Codes traf der Code die ganze Zeit auf den Catch-Block. Dann habe ich herausgefunden, wann immer eine Javascript-Ausnahme auftritt, wird sie stillschweigend ausgelöst. Aus diesem Grund wurde der Catch-Block ausgeführt. Dann habe ich sichergestellt, dass beim Aufrufen dieser Funktion kein Fehler auftritt. Ich denke, Typoskript sollte in solchen Fällen erzwungen werden, um Fehler in der Laufzeit zu vermeiden.

{enableHighAccuracy: true, timeout: 10000, maximumAge: 0}
Was ich gefunden habe, wenn ich den zweiten Parameter überspringe oder weniger als 10000 Werte gebe, was den Fehler ergibt

Versuchen Sie, alle drei Parameter wie oben anzugeben, um mein Problem zumindest im Emulator zu lösen

Versuchen Sie, diese Berechtigungen zu Ihrer _AndroidManifest.xml_ hinzuzufügen :

<_uses-erlaubnis i = "6" />
<_uses-erlaubnis i = "8" />
<_permission_ i = "10" /> _android: name = "android.permission.ACCESS_COARSE_LOCATION" _
_android: protectedLevel = "Signatur" _ />
<_permission_ i = "13" /> _android: name = "android.permission.ACCESS_FINE_LOCATION" _
_android: protectedLevel = "Signatur" _ />

Hallo, ich hatte das gleiche Problem "Timeout anfordern". Ich habe jede mögliche Lösung wie oben angegeben ausprobiert. Diese konnte für mich nicht funktionieren, aber kürzlich habe ich ein Modul gefunden, das dieses Problem löst.
https://www.npmjs.com/package/react-native-geolocation-service
Das hat bei mir funktioniert .....

@vishalTechnoFreek , existiert auch -Native-Cross-Geolocation .

Es ist vollständig kompatibel mit der aktuellen RN-Geolokalisierung, verwendet jedoch die neue Google-API. Mit dieser API machen Sie sich keine Sorgen darüber, welchen Modus Sie verwenden möchten. Der Dienst erkennt automatisch die beste Option.

Ein weiterer Vorteil ist, dass Sie, wenn RN dieses Problem behebt, es entfernen können, ohne Ihre App zu beeinträchtigen, wenn Sie dies wünschen.

Für meinen Fall hat das, was @manurana über das (Herunterladen und) Öffnen der Google Maps-App und das

Ich arbeite mit Genymotion und Android 5.

Für Genymotion-Benutzer muss das Kartenfenster von Genymotion geöffnet werden, damit die Position richtig gelesen werden kann. Andernfalls funktioniert es jedoch mit dem Standardspeicherort von Geny

Das Setzen von enableHighAccuracy auf true oder false funktioniert bei mir nicht.
Das Weglassen des dritten Arguments für getCurrentPosition zur Verwendung von Standardwerten aus dem nativen Modul funktioniert für mich.

Lebensretter - das hat bei mir funktioniert.

Ich Jungs,
Ich hatte den gleichen Fehler, aber nach einigen Wiederholungen mit meinen Kollegen stellen wir etwas Seltsames fest (aber normal, wenn Sie etwas über GPS wissen).

Wenn Sie Tests "in Ihrem Büro" mit einem physischen Gerät ausführen, kann der GPS-Ortungsgerät durch äußere Einflüsse wie Wände oder durch den einfachen Grund, dass Sie versuchen, diesen Vorgang "drinnen" durchzuführen, gestört werden. Dies sollte im Allgemeinen im Freien durchgeführt werden .

Nun, nachdem wir unser Büro verlassen haben, führen wir die Tests erneut aus und das Gerät reagiert wie geplant (wir haben den Fehler "Zeitüberschreitung bei Anforderung" nicht erhalten).

Mein Vorschlag ist: Versuchen Sie die Geolokalisierung mit "enableHighAccuracy" auf "true". Wenn dies fehlschlägt (im Büro kann dies fehlschlagen), versuchen Sie es erneut mit "false". Dies sollte funktionieren, in meinem Fall.

Hoffe das kann helfen.

Ich habe das gleiche Problem, aber das Setzen von enableHighAccuracy auf false funktioniert bei mir nicht. Diese Lösung, die perfekt erscheint, funktioniert bei mir also nicht.

Ich hatte ein ähnliches Problem mit mehreren Anforderungen (kontinuierliche Auswahl des aktuellen Standorts verwenden). Ich habe einen erneuten Versuch für die Standortanforderung hinzugefügt. nicht das genaue Problem, aber möglicherweise wird jemand helfen.

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
Dieses Paket hat das Problem für mich gelöst.
Fast alle oben genannten Vorschläge haben bei mir nicht funktioniert.

Hallo Gast, ich löse das Geheimnis, was passiert ist, wenn wir das erste Mal nach dem Ort fragen und "maximunAge" verwenden, haben wir keinen vorherigen Ort zwischengespeichert, also gibt es einen Fehler, stellen Sie sicher, dass Sie beim ersten Mal nachfragen Standort ist ohne "maximunAge"

Die einfache Antwort besteht darin, aus Ihrem Standort herauszutreten, in den offenen Raum zu gehen und es erneut zu versuchen.

Seine einfache Wissenschaft.

GPS-Dienste sind von dicken Mauern und Autos betroffen.

Das hat bei mir funktioniert. Keine Notwendigkeit, etwas zu bearbeiten !!!

In meinem Fall hat das Entfernen von MaximumAge das Problem gelöst.

Vielen Dank! Arbeit!

Hallo,
Keine der Lösungen funktioniert für mich.
Ich verwende navigator.geolocation und verwende nur {enableHighAccuracy: false} als dritten Parameter.
Unter iOS funktioniert es einwandfrei und unter Android funktioniert es auf bestimmten Geräten nicht.
Ich habe Android 7, 8, 9 eingecheckt. Es funktioniert nicht in Lenovo Telefon mit Android 7. Aber funktioniert mit anderen Geräten mit Android 7.

Hat jemand eine Problemumgehung, um dieses Problem zu lösen?
Jeder Vorschlag ist spürbar.

Vielen Dank

@akhilsanker versuchen React -Native-Fused-Location

Hallo @reyalpsirc ,

Danke für die Antwort. Wirklich schätzen für Ihre Zeit.
Es gibt kein Problem in iOS und funktioniert gut in den meisten Android-Geräten. Ich habe nur eine begrenzte Zeitbeschränkung und es wird schwierig sein, eine neue Bibliothek zu verwenden, wie Sie vorgeschlagen haben.
Haben Sie eine andere Problemumgehung, um dieses Problem zu lösen?
Vielen Dank für Ihre Zeit.

Vielen Dank.

Sorry @akhilsanker , ich habe nur Geolocation von React Native für iOS und FusedLocation für Android verwendet.

Das Setzen von maximumAge:0 hat bei mir funktioniert:
{ enableHighAccuracy: true, timeout: 60000, maximumAge:0 }
Vielleicht hat @GersonM recht ...

Das Geolocation-Modul wird im Master aus RN entfernt und ist in 0.60 nicht verfügbar. Bitte verwenden Sie https://github.com/react-native-community/react-native-geolocation und melden Sie dort Probleme. Vielen Dank

Es ist 2019, 3 verschiedene Standortbibliotheken ausprobiert, von denen keine für Android funktioniert. Tolle.

Es ist 2019, 3 verschiedene Standortbibliotheken ausprobiert, von denen keine für Android funktioniert. Tolle.

Der React-Native-Geolocation-Service funktioniert einwandfrei.

Wenn ein Paket nicht funktioniert, erstellen Sie ein Issue-Ticket für dieses Repo. Probleme beheben sich nicht von selbst. Treten Sie der Community bei.

siehe iwangsyahs Kommentar. Ich brauchte sowohl die <permission> __- als auch die <uses-permission> Meta-Tags

https://www.npmjs.com/package/react-native-geolocation-service
Dieses Paket hat das Problem für mich gelöst.
Fast alle oben genannten Vorschläge haben bei mir nicht funktioniert.

Vielen Dank!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen